15

SOAP ヘッダーを Spring Jax-WS クライアントに追加するにはどうすればよいですか?

具体的には、ヘッダーに追加したいJaxbオブジェクトがありますが、xmlの例をいただければ幸いです。

ここで説明されている Spring の JaxWsPortProxyFactoryBean を使用しています。また、ここで説明されているように、追加する必要のあるヘッダーが少ないクライアントを生成しています。

ありがとうございました。

4

4 に答える 4

6

わずかに異なる解決策が見つかった場合は、いくつか突っついた後。ペイロードのマーシャリングに JAXB を使用しており、可能なヘッダー クラスも WSDL から JAXB で生成されています。私の場合、Microsoft Reporting Services に対処しており、ExecutionID を SOAP ヘッダーとして渡しています。

public class ReportExecution2005Client extends WebServiceGatewaySupport {

    private static final String SET_EXECUTION_PARAMETERS_ACTION = "http://schemas.microsoft.com/sqlserver/2005/06/30/reporting/reportingservices/SetExecutionParameters";

    private final class SoapActionExecutionIdCallback implements WebServiceMessageCallback {

        private final String soapAction;
        private final String executionId;

        public SoapActionExecutionIdCallback(String soapAction, String executionId) {
            super();
            this.soapAction = soapAction;
            this.executionId = executionId;
        }

        @Override
        public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
            SoapMessage soapMessage = (SoapMessage) message;
            soapMessage.setSoapAction(soapAction);
            ExecutionHeader executionHeader = new ExecutionHeader();
            executionHeader.setExecutionID(executionId);
            getMarshaller().marshal(executionHeader, soapMessage.getSoapHeader().getResult());
        }
    }

    public void setExecutionParameters(String executionId){
        SetExecutionParameters request = new SetExecutionParameters();
        request.setParameters(new ArrayOfParameterValue());

        SetExecutionParametersResponse response = (SetExecutionParametersResponse) getWebServiceTemplate().marshalSendAndReceive(request,
                new SoapActionExecutionIdCallback(
                        SET_EXECUTION_PARAMETERS_ACTION,
                        executionId));
    }
}

基本的に、WebServiceGatewaySupport は、マーシャラーが JAXB Pojo を変換することを既に認識しています。これを使用して、独自のヘッダー クラスを次の行で SoapHeader にアタッチしています。

getMarshaller().marshal(executionHeader, soapMessage.getSoapHeader().getResult());

ネストされた WebServiceMessageCallback で。

于 2015-09-03T16:39:45.980 に答える
6

私はまだヘッダーを追加するエレガントな方法を見つけようとしていますが、他の人が提案したように、WebServiceMessageCallBack() でトランスフォーマーを使用することです。コード例を次に示します。

JAXBElement<GetDeletedResponse> result = (JAXBElement<GetDeletedResponse>) webServiceTemplate.marshalSendAndReceive(request, new WebServiceMessageCallback() {
public void doWithMessage(WebServiceMessage webServiceMessage) {
    try {
        SoapMessage soapMessage = (SoapMessage) webServiceMessage;
        soapMessage.setSoapAction("getDeleted");

        SoapHeader header = soapMessage.getSoapHeader();
        StringSource headerSource = new StringSource("<account>\n" +
                                "<username>"+"johnsmith"+"</username>\n" +
                                "<password>"+"1234"+"</password>\n" +
                                "</account>");
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(headerSource, header.getResult());

       } catch (Exception e) {
         new RuntimeException(e);
       }
}
...

これは Spring の WS であることを考えると、あまりエレガントではありません。直感的ではありません。

于 2010-12-06T15:04:54.190 に答える