首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SpringBoot添加自定义SoapHeader

使用SpringBoot添加自定义SoapHeader
EN

Stack Overflow用户
提问于 2018-05-03 18:53:24
回答 1查看 2K关注 0票数 0

使用SoapUI,我可以发送一个带有自定义SOAP头的请求,如下所示:

代码语言:javascript
复制
<soap:Header>
    <To xmlns="http://www.w3.org/2005/08/addressing">ws://xxx.com/PP/QM/GPMService/Vx</To>
   <Action xmlns="http://www.w3.org/2005/08/addressing">http://xmldefs.xxx.com/PP/QM/GPMService/Vx/AbcService/GetServiceInfoRequest</Action>
    <MessageID xmlns="http://www.w3.org/2005/08/addressing">ITEST-2018-04-16-0001</MessageID>
    <Stage xmlns="http://xmldefs.xxx.com/Technical/Addressing/V1">ProdX</Stage>
</soap:Header>

并得到一个合理的回应。我不能在我的SpringBoot应用程序中实现这一点。我有一个扩展WebServiceGatewaySupport的服务:

代码语言:javascript
复制
@Service
public class AbcService extends WebServiceGatewaySupport{
    private AbcConfiguration abcConfiguration;

    @Autowired
    public void setAbcConfiguration(final AbcConfiguration abcConfiguration) {
        this.abcConfiguration = abcConfiguration;
    }

    public GetServiceInfoResponse GetServiceInfo() {
        final String actionStr = "GetServiceInfo";
        final ObjectFactory factory = new ObjectFactory();

        GetServiceInfo getServiceInfo = factory.createGetServiceInfo();
        JAXBElement<GetServiceInfo> gsiRequest = factory.createGetServiceInfo(getServiceInfo);
        WebServiceTemplate wst = this.getWebServiceTemplate();
        @SuppressWarnings("unchecked")
        JAXBElement<GetServiceInfoResponse> gsiResponse = (JAXBElement<GetServiceInfoResponse>)wst
            .marshalSendAndReceive("https://ws-gateway-cert.xxx.com/services/", gsiRequest, new WebServiceMessageCallback() {
                    @Override
                    public void doWithMessage(WebServiceMessage message) {
                        try {
                            SoapHeader soapHeader = ((SoapMessage) message).getSoapHeader();
                            SoapHeaderElement toElem = soapHeader.addHeaderElement(new QName("http://www.w3.org/2005/08/addressing", "To"));
                            toElem.setText("ws://xxx.com/PP/QM/GPMService/Vx");
                            ...
                        } catch (Exception e) {
                            logger.error("Error during marshalling of the SOAP headers", e);
                        }
                    }
            });

        return gsiResponse.getValue();
    }
}

我做错了什么?有人能告诉我怎么做吗?

好吧。到目前为止,我让它正常工作,SOAP XML看起来像是所需的,在SoapUI中运行请求(由我的SpringBoot应用程序生成),我得到了所需的结果。

代码语言:javascript
复制
    public GetServiceInfoResponse GetServiceInfo() {
    final String actionStr = "GetServiceInfo";
    final ObjectFactory factory = new ObjectFactory();

    GetServiceInfo getServiceInfo = factory.createGetServiceInfo();
    JAXBElement<GetServiceInfo> gsiRequest = factory.createGetServiceInfo(getServiceInfo);
    WebServiceTemplate wst = this.getWebServiceTemplate();
    @SuppressWarnings("unchecked")
    JAXBElement<GetServiceInfoResponse> gsiResponse = (JAXBElement<GetServiceInfoResponse>)wst
        .marshalSendAndReceive(kpmConfiguration.getEndpoint(), gsiRequest, new WebServiceMessageCallback() {
                @Override
                public void doWithMessage(WebServiceMessage message) {
                    System.out.println(message.toString());
                    try {
                        // get the header from the SOAP message
                        final SoapHeader soapHeader = ((SoapMessage) message).getSoapHeader();
                        final SaajSoapMessage ssMessage = (SaajSoapMessage)message;
                        final SOAPEnvelope envelope = ssMessage.getSaajMessage().getSOAPPart().getEnvelope();
                System.out.println("envelope.getPrefix(): " + envelope.getPrefix());
                        envelope.removeNamespaceDeclaration("SOAP-ENV");
                        envelope.setPrefix(NAMESPACE_PREFIX_SOAP);

                System.out.println("envelope.getPrefix(): " + envelope.getPrefix());
                        envelope.getBody().setPrefix(NAMESPACE_PREFIX_SOAP);
                        envelope.getHeader().setPrefix(NAMESPACE_PREFIX_SOAP);
                        envelope.addNamespaceDeclaration(NAMESPACE_PREFIX_SOAP, NAMESPACE_PREFIX_SOAP_DEF);
                        envelope.addNamespaceDeclaration(NAMESPACE_PREFIX_V2, NAMESPACE_PREFIX_V2_DEF);
                        envelope.addNamespaceDeclaration(NAMESPACE_PREFIX_WSSE, NAMESPACE_PREFIX_WSSE_DEF);

                        final SoapHeaderElement toElem = soapHeader.addHeaderElement(new QName(NAMESPACE_PREFIX_ADDRESSING, "To"));
                        toElem.setText(TO_VALUE);

                        final SoapHeaderElement actionElem = soapHeader.addHeaderElement(new QName(NAMESPACE_PREFIX_ADDRESSING, "Action"));
                        actionElem.setText(NAMESPACE_PREFIX_V2_DEF + "/AbcService/" + actionStr + "Request");

                        final SoapHeaderElement messageIdElem = soapHeader.addHeaderElement(new QName(NAMESPACE_PREFIX_ADDRESSING, "MessageID"));
                        messageIdElem.setText(MESSAGE_ID_VALUE + UUID.randomUUID());

                        final SoapHeaderElement stageElem = soapHeader.addHeaderElement(new QName(NAMESPACE_PREFIX_VWA, "Stage"));
                        stageElem.setText("Production");

                        final NodeList nl = ssMessage.getSaajMessage().getSOAPPart().getEnvelope().getBody().getChildNodes();

                        ssMessage.getSaajMessage().getSOAPPart().getEnvelope().getBody().removeChild(nl.item(0));
                        final SOAPElement se = ssMessage.getSaajMessage().getSOAPPart().getEnvelope().getBody().addBodyElement(new QName(actionStr));
                        se.setPrefix(NAMESPACE_PREFIX_V2);
                        final SOAPElement userAuthElem = se.addChildElement(new QName("UserAuthentification"));
                        final SOAPElement userIdElem = userAuthElem.addChildElement("UserId");
                        userIdElem.setTextContent(kpmConfiguration.getCredentials().getUsername());
                    System.out.println(userIdElem.getTextContent());
                    Transformer transformer = TransformerFactory.newInstance().newTransformer();
                    transformer.transform(ssMessage.getPayloadSource(), soapHeader.getResult());
                    } catch (Exception e) {
                        logger.error("Error during marshalling of the SOAP headers", e);
                    }
                }
            });
    return gsiResponse.getValue();
}

然而,当我从我的SpringBoot应用程序提交请求时,我总是得到一个异常:

代码语言:javascript
复制
java.net.SocketException: Unexpected end of file from server

我是不是在代码中遗漏了什么?

EN

回答 1

Stack Overflow用户

发布于 2018-05-08 17:01:08

在编辑后的问题中,请参阅上述原始问题的答案。关于java.net.SocketException: Unexpected end of file from server,它似乎来自于通过Eclipse的TCP/IP Monitor重定向请求。当将请求直接发送到服务器时,我得到了一个有意义的响应:

INFO_001方法已成功完成

:-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50153292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档