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 を受け取るようになりました。なぜそのようなことが起こるのか誰にもわかりません。