5

jax-wsの@UsesJAXBContextアノテーションについて質問したいです。クライアント側で動作させようとしていますが、おそらく何かが欠けています。これが私のケースです:

私は操作を伴うWebサービスを持っています:

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

クライアント側では、QueueService と Queue (ポート) を生成しました...その他のもの... [respones requests. この場合は無関係です。] ユーザーがキューに入れることができるオブジェクトを定義できるようにしたいと思います。ただし、操作put(...)を呼び出すには、(送信しようとしている) オブジェクトを JAXBContext にバインドする必要があります。生成された Queue スタブの上部にある@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);
    }
}

次に、生成されたキューの上で@UsesJAXBContextを使用してみました。

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

ただし、createJAXBContext(...)は呼び出されず、jax-ws は単純に JAXBContextImpl を作成します。

読みました:

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

そしてstackOverFlowに関するいくつかの質問。アドバイスをいただければ幸いです。私の質問に提示されたアイデアを実装することは可能ですか?

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

4

1 に答える 1

6

さて、私は直面していた問題を管理することができました。それでも、Webサービスを使用するクライアントで@UsesJAXBContextを使用できませんでした。しかし、このアノテーションは修正後の機能を備えたBeanに関連付けられていることがわかりました。したがって、UsesJAXBContextFeatureクラスがあります

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

ポートまたはサービスの引数として渡すことができます(jax-ws 2.2以降のサービス)。バージョンに少し問題があったので、クラスを生成してjax-ws2.1を使用することにしました。今、私は単にこのようなポートを作成します:

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

そしてそれは動作します!

于 2012-06-22T12:11:56.803 に答える