Добавьте пользовательский SoapHeader с помощью SpringBoot - PullRequest
0 голосов
/ 03 мая 2018

Используя SoapUI, я могу отправить запрос с пользовательским заголовком SOAP, например:

<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:

@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 выглядит как требуемый, и при выполнении запроса (генерируемого из моего приложения SpringBoot) в SoapUI я получаю требуемый результат.

    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, я всегда получаю исключение:

java.net.SocketException: Unexpected end of file from server

Я что-то упустил в коде?

1 Ответ

0 голосов
/ 08 мая 2018

См. Ответ на оригинальный вопрос выше в отредактированном вопросе. Что касается java.net.SocketException: Unexpected end of file from server, то, похоже, это произошло из-за перенаправления запроса через монитор TCP / IP Eclipse. При отправке запроса непосредственно на сервер я получаю значимый ответ:

INFO_001 Метод успешно выполнен

: -)

...