End WS类中的Spring WS SOAP响应头修改

问题描述 投票:0回答:1

我是Spring WS的新手,也是实现服务的新手。为此,我使用的是EndPoint类,可以成功接收请求并发送响应。

SOAP Request消息包含我成功提取的SOAP头中的重要信息。某些信息也必须在SOAP响应头中发送,但我无法编辑或修改SOAP响应头。

我需要帮助了解创建SOAP响应标头和SOAP响应消息的最佳方法和最佳实践。

您可以在下面找到我的EndPoint课程:

 @Endpoint
public class EndpointAccountInformationInquiry {

    private static final String TARGET_NAMESPACE = "http://www.sample.com/inquiry/GetAccountInformation";

    @Autowired
    private ServiceAccountInformation service;

    @PayloadRoot(localPart = "GetAccountInformationRq", namespace = TARGET_NAMESPACE)
    public @ResponsePayload GetAccountInformationRs handleRequest(@RequestPayload GetAccountInformationRq request, MessageContext messageContext) throws JAXBException, TransformerException {

        /*****************************************************************
         * Parse the request header and body
         * Also create response body and header
         *****************************************************************/
        SaajSoapMessage soapRequest = (SaajSoapMessage) messageContext.getRequest();
        SoapHeader soapRequestHeader = soapRequest.getSoapHeader();

        SaajSoapMessage soapResponse = (SaajSoapMessage) messageContext.getResponse();
        SoapHeader soapResponseHeader = soapResponse.getSoapHeader();        

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();

        MyHeaderClassRq myHeaderClassRq = null;
        JAXBContext jaxbContext = JAXBContext.newInstance(MyHeaderClassRq.class);
        Iterator<SoapHeaderElement> itr = soapRequestHeader.examineAllHeaderElements();
        while (itr.hasNext()) {
            SoapHeaderElement ele = itr.next();

            myHeaderClassRq = (MyHeaderClassRq)jaxbContext.createUnmarshaller().unmarshal(ele.getSource());
            transformer.transform(ele.getSource(), soapResponseHeader.getResult());
        }

        /*****************************************************************
         * Call the handler function
         * This handler function is asynchronous
         *****************************************************************/
        service.handleRequest(request, msgHdrRq);

        /*****************************************************************
         * Set the response body and header over here
         *****************************************************************/
         //TODO: I want to modify my response header over here....

        GetAccountInformationRs response = new GetAccountInformationRs();
        return response;
    }
}
java soap spring-ws endpoint
1个回答
0
投票

我自己解决了。

您可以在以下部分中看到以下代码:

/*****************************************************************

*创建响应正文和标题

*并寄回

*****************************************************************/

 @Endpoint
public class EndpointAccountInformationInquiry {

//  private Logger logger = Logger.getLogger(EndpointAccountInformationInquiry.class);

    private static final String TARGET_NAMESPACE = "http://www.sample.com/inquiry/GetAccountInformation";

    @Autowired
    private ServiceAccountInformation service;

    @PayloadRoot(localPart = "GetAccountInformationRq", namespace = TARGET_NAMESPACE)
    public @ResponsePayload GetAccountInformationRs handleRequest(@RequestPayload GetAccountInformationRq request, MessageContext messageContext) throws JAXBException, TransformerException {

        /*****************************************************************
         * Parse the request header and body
         * Also create response body and header
         *****************************************************************/
        SaajSoapMessage soapRequest = (SaajSoapMessage) messageContext.getRequest();
        SoapHeader soapRequestHeader = soapRequest.getSoapHeader();

        SaajSoapMessage soapResponse = (SaajSoapMessage) messageContext.getResponse();
        SoapHeader soapResponseHeader = soapResponse.getSoapHeader();        

        MyHeaderClassRq myHeaderClassRq = null;
        JAXBContext jaxbContext = JAXBContext.newInstance(MyHeaderClassRq.class);
        Iterator<SoapHeaderElement> itr = reqheader.examineAllHeaderElements();
        while (itr.hasNext()) {
            SoapHeaderElement ele = itr.next();
            myHeaderClassRq = (MyHeaderClassRq)jaxbContext.createUnmarshaller().unmarshal(ele.getSource());
        }

        /*****************************************************************
         * Call the handler function
         * This handler function is asynchronous
         *****************************************************************/
        service.handleRequest(request, myHeaderClassRq);

        /*****************************************************************
         * Create response body and header
         * And send back
         *****************************************************************/
        //Response header
        MyHeaderClassRs myHeaderClassRs = new MsgHdrRs();
        //Set header values here

        //Response body
        GetAccountInformationRs response = new GetAccountInformationRs();

        /*****************************************************************
         * Send response back
         *****************************************************************/
        jaxbContext = JAXBContext.newInstance(MyHeaderClassRs.class);
        jaxbContext.createMarshaller().marshal(myHeaderClassRs, soapResponseHeader.getResult());

        return response;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.