Как добавить информацию в запрос SOAP JAXBElement?

У меня есть класс, сгенерированный с помощью JAXB2 из WSDL. Элементы, определенные в WSDL, НЕ объявляются как XmlRootElement.

@Service
public class ProblemService extends WebServiceGatewaySupport {
    public ProblemResponse addProblem(final Problem problem, final String aNumber) {
    final String namespacePrefix = "soapenv";
    final String action = "Problem";
    final ObjectFactory factory = new ObjectFactory();

    final JAXBElement<Problem> request = factory.createProblem(problem);
    try {
        StringResult result = new StringResult();
        getMarshaller().marshal(request, result);
        System.out.println(result.toString());
    } catch (Exception e) {
        e.printStackTrace(System.err);
    }

    final WebServiceTemplate wst = this.getWebServiceTemplate();
    @SuppressWarnings("unchecked")
    final JAXBElement<ProblemResponse> response = (JAXBElement<ProblemResponse>) wst
            .marshalSendAndReceive(abcConfiguration.getEndpoint(), request, new WebServiceMessageCallback() {
                @Override
                public void doWithMessage(final WebServiceMessage message) {
                    try {

                        prepareSoapHeader(message, namespacePrefix, action);
                        final SaajSoapMessage ssMessage = (SaajSoapMessage) message;
                        final SOAPEnvelope envelope = ssMessage.getSaajMessage().getSOAPPart().getEnvelope();
                        envelope.getBody().setPrefix(namespacePrefix);

                        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(action));
                        se.setPrefix(NAMESPACE_PREFIX_V2);
                        addUserAuthentification(se);

                        try {
                            StringResult result = new StringResult();
                            getAbcConfiguration().marshaller().marshal(request, result);
                            System.out.println(result.toString());
                        } catch (Exception e) {
                            e.printStackTrace(System.err);
                        }
                        System.out.println();
                    } catch (SoapFaultClientException e) {
                        logger.error("Error on client side during marshalling of the SOAP request for {}.", action, e);
                    } catch (SOAPException e) {
                        logger.error("Error during marshalling of the SOAP request for {}.", action, e);
                    }
                }
            });

    return response.getValue();
}

}

Сгенерированный StringResult выглядит довольно хорошо, но мне нужно заменить некоторые части в результирующем XML (например, префикс), и мне нужно добавить некоторые вещи в SoapBody, которые не являются частью базового класса (Problem) перед отправкой SOAP-запроса к удаленному сервису.

Кроме того, я хочу изменить заголовок конверта... Как мне этого добиться? Мое приложение является приложением SpringBoot, и в классе конфигурации, используемом в моем сервисе, un / / marshaller определяется следующим образом:

@Bean
public Jaxb2Marshaller marshaller() {
    final Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    //setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.setContextPath(contextPath);
    //marshaller.afterPropertiesSet();
    marshaller.setMarshallerProperties(new HashMap<String, Object>() {{
          put(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, true);
        }});

    return marshaller;
}

@Bean
public ProblemService problemService(final Jaxb2Marshaller marshaller) throws Exception {
    final ProblemService client = new ProblemService();
    client.setDefaultUri(this.endpoint);
    client.setMarshaller(marshaller);
    client.setUnmarshaller(marshaller);

     final HttpsUrlConnectionMessageSender msgSender = new HttpsUrlConnectionMessageSender();
    client.setMessageSenders(new WebServiceMessageSender[] {msgSender, httpComponentsMessageSender()});
    //client.setMessageSender(msgSender);

     return client;
}

1 ответ

С помощью этого небольшого фрагмента кода я смог добавить информацию в SoapBody по требованию:

try {
    getKpmConfiguration().marshaller().marshal(request, ssMessage.getPayloadResult());
    ssMessage. writeTo(System.out);
} catch (/*JAXB*/Exception e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
Другие вопросы по тегам