5

春のプロジェクトから WSDL 操作の 1 つを呼び出すと、次の例外が発生します - com.sun.istack.internal.SAXException2: unable to marshal type "com.pkg.wsdl.ABC" as an element because it is missing an @XmlRootElement annotation

私はpom.xmlで以下を使用して、春のプロジェクトの一部としてWSDL(すでに多くのクライアントで使用されています)からJavaオブジェクトを生成しています -

        <groupId>org.jvnet.jaxb2.maven2</groupId>
        <artifactId>maven-jaxb2-plugin</artifactId>
        <version>0.13.1</version>

同様の問題の解決策を見て、JAXBElement を使用するようにコードを変更しましたが、それでも同じエラーが発生します -

    ABC vabc = new ABC();
    vabc.set(..)   // populate vabc object 

    ObjectFactory of = new ObjectFactory();
    JAXBElement<ABC> jabc = of.createABC(vabc);
    ABC oabc = jabc .getValue();

マーシャラー コード -

Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("com.pkg.wsdl");

バックエンド Web サービスの呼び出し -

        ABCResp response = (ABCResp) getWebServiceTemplate()
        .marshalSendAndReceive("http://host:port/svcname",oabc);
4

1 に答える 1

7

私が解決しなければならなかった次の問題がありました -
1 - 以下に示すように、xmlRootElementアノテーションエラー
が見つからないため、marshalSendAndReceiveでJAXBElement自体を渡す必要がありました。
QName の ObjectFactory から正確な詳細を引き出すことができます。

2- リクエスト エラーで soapAction が欠落しているため、
以下に示すように、soapAction を設定するために WebServiceMessageCallback 関数を渡す必要が

あり
ました

ABCResp response = (ABCResp ) JAXBIntrospector.getValue(getWebServiceTemplate()
        .marshalSendAndReceive(
                "http://host:port/svcname",
                new JAXBElement<ABC>(new QName(uri, localpart),ABC.class,request),
                new WebServiceMessageCallback() {

                    public void doWithMessage(WebServiceMessage message) {
                        ((SoapMessage)message).setSoapAction("/test");
                    }
                }));        
于 2016-10-17T11:16:18.213 に答える