2012-06-20 15 views
5

jax-wsの@UsesJAXBContextアノテーションについて質問があります。私はそれをクライアント側で動作させようとしますが、おそらく何かが欠けています。私が運転してWebサービスを持っているカスタムJAXBContextの設定方法

::私はQueueServiceとキュー(ポート)...と他のものを生成し、クライアント側で

@WebMethod(operationName = "putToQueue") 
public boolean put(@WebParam(name = "queueName") String queueName, @WebParam(name = "element") Object element) { 
    return queues.get(queueName).offer(element); 
} 

... [respones要求ここに私の場合です。この場合は無関係です。] キューに入れることができるオブジェクトをユーザーが定義できるようにしたいと思います。しかし、操作を呼び出すには put(...) JAXBContextにバインドオブジェクト(送信しようとする)が必要です。私は @XmlSeeAlsoによって生成されたキュースタブの上にそれを行うことができました[私はこれを試して、それは動作します]。それでも、実行時にオブジェクトをバインドするための汎用ソリューションが必要です。 私は @QueueMessage注釈とClientJAXBContextFactoryを作成し、それを作成するときにマークされたクラスをコンテキストに追加できると考えました。

public class ClientJAXBContextFactory implements JAXBContextFactory { 

    @Override 
    public JAXBRIContext createJAXBContext(SEIModel seim, List<Class> classes, List<TypeReference> references) throws JAXBException { 
     Reflections reflections = new Reflections(""); 
     Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(QueueMessage.class); 
     classes.addAll(annotated); 

     return JAXBContextFactory.DEFAULT.createJAXBContext(seim, classes, references); 
    } 
} 

次にiが生成されるキューの先頭に@UsesJAXBContext使用を試みました。

@WebService(name = "Queue") 
@UsesJAXBContext(ClientJAXBContextFactory.class) 
public interface Queue { 
... 
} 

しかし createJAXBContext(...)が呼び出されていないとJAX-WSは、単に彼のJAXBContextImplを作成します。

私が読んでいる:StackOverflowの上

http://weblogs.java.net/blog/jitu/archive/2008/08/control_of_jaxb.html

http://www.techques.com/question/1-5627173/Specify-JAXB-Packages-in-SLSB-and-JAX-WS

といくつかの質問を。私は助言に感謝するでしょう。 私の質問に提示されたアイデアを実装することは可能ですか?

また、私はそれをサーバー側に追加するかもしれません... @UsesJAXBContext作品。しかし、クライアント側でそれを動作させることが重要です。

答えて

5

私は直面していた問題を管理できました。それでも私は @UsesJAXBContextをクライアントがWebサービスを消費して使用することができませんでした。しかし、私はこの注釈がポストフィックスフィーチャーを使ってBeanに結びついていることを発見しました。だからクラス UsesJAXBContextFeature

https://jax-ws.java.net/nonav/2.2.7/javadocs/com/sun/xml/ws/developer/UsesJAXBContextFeature.html

であり、それがポートまたはサービスの引数(JAX-WS 2.2以降のサービス)として渡すことができます。私はバージョンに少し問題があるので、クラスを生成し、jax-ws 2.1を使用することにしました。今すぐこのようなポートを作成するだけです:

new QueueService().getQueuePort(new UsesJAXBContextFeature(new ClientJAXBContextFactory())); 

そして、それは機能します。

関連する問題