0

我有一个使用 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();
}

}

生成的看起来不错,但我需要替换生成的 XML 中的某些部分(例如前缀),并且在将 SOAP 请求发送到远程之前StringResult,我需要在 SoapBody 中添加一些不属于基类()的东西Problem服务。

此外,我想修改信封的标题部分......我怎样才能做到这一点?我的应用程序是 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;
}
4

1 回答 1

0

通过这段小代码,我可以根据需要向 SoapBody 添加信息:

try {
    getKpmConfiguration().marshaller().marshal(request, ssMessage.getPayloadResult());
    ssMessage. writeTo(System.out);
} catch (/*JAXB*/Exception e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
于 2018-05-18T12:05:31.270 回答