0

Spring Web サービスを使用しており、Spring Web サービス/xml バージョンは 2.1.3 ですが、他の Spring コア バージョンは 3.2.3 です。SOAP ヘッダーにアクセスし、応答ヘッダーを要求ヘッダーと同じに設定する必要があります。PayloadValidationInterceptor を拡張して、以下のように追加のロジックを追加しました。

@Override
public void afterCompletion(MessageContext messageContext, Object endpoint,
        Exception ex) {
    //System.out.println("afterCompletion");
    SaajSoapMessage soapRequest = (SaajSoapMessage) messageContext
            .getRequest();
    SoapHeader reqheader = soapRequest.getSoapHeader();
    SaajSoapMessage soapResponse = (SaajSoapMessage) messageContext
            .getResponse();
    SoapHeader respheader = soapResponse.getSoapHeader();
    if( reqheader !=null ){
        TransformerFactory transformerFactory = TransformerFactory
            .newInstance();
        try {
            Transformer transformer = transformerFactory.newTransformer();
            Iterator<SoapHeaderElement> itr = reqheader
                    .examineAllHeaderElements();
            while (itr.hasNext()) {
                SoapHeaderElement ele = itr.next();
                transformer.transform(ele.getSource(), respheader.getResult());
            }
        } catch (Exception e) {
            LOG.error(Toolkit.getStackTrace(e));
        }
    }

}

また、Spring Web サービス構成では、SAAJ Soap メッセージが確実に使用されるように、次のメッセージ ファクトリを追加しました。

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
    <property name="soapVersion">
        <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_12" />
    </property>
</bean>

テストすると、物事は正常です。しかし、作業負荷が高い本番環境では、messageContext.getRequest() が SaajSoapMessage ではなく DomPoxMessage を返すため、ClassCastException を受け取るようになりました。なぜそのようなことが起こるのか誰にもわかりません。

4

1 に答える 1

0

あなたが提供した情報に基づいて、私は正確な理由を得ることができません. ただし、この問題を回避するために、メッセージ ファクトリを引数として受け取る SAAJSOAPMessageFactoryのコンストラクタを使用できます。このようにして、SaajSoapMessageFactory のみが使用されていることを確認できます。jdk が適切な SOAP ファクトリを検索する方法は、最初に Java ホームで jaxm.properties を検索するか、クラスパスrefで適切な実装を検索することです。

于 2013-10-14T09:44:15.807 に答える