Spring Soap拦截器如何修改消息的内容?

Dav*_*ave 5 java soap web-services spring-ws

我正在尝试为Web服务编写一个拦截器,它将在发送到端点之前修改Soap消息的内容.如果客户端发送了一个消息,其中某个元素的值为1,我希望能够将该元素更改为2,这样,当消息到达端点时,它看起来好像客户端提交了2而不是我不确定这是一项困扰我的艰巨任务,还是一项我正在努力实现的艰巨任务.

我已经介入了一些Spring拦截器; 但是验证和日志记录拦截器并不是每个都会改变传输中的消息.Wss4jSecurityInterceptor确实为MessageContext添加了一些属性; 但我无法利用它正在做的任何事情.我有一个拦截器的外壳; 但没有任何东西可以做任何有价值的事情.

public boolean handleRequest(MessageContext messageContext, Object endpoint)
        throws Exception {

    SaajSoapMessage saajSoapMessage = (SaajSoapMessage) messageContext
            .getRequest();
    SOAPMessage soapMessage = saajSoapMessage.getSaajMessage();
    SOAPBody soapBody = soapMessage.getSOAPBody();

    return true;
}
Run Code Online (Sandbox Code Playgroud)

我希望其他人可能已经解决了这个特殊问题.任何见解将不胜感激.谢谢.

ska*_*man 6

修改有效负载有点棘手.我发现使这项工作的唯一方法是使用getPayloadSource()getPayloadResult()方法SoapBody,它们公开了javax.xml.transform友好的对象来操纵数据.

这是令人讨厌的重量级,但你可以这样做:

Transformer identityTransform = TransformerFactory.newInstance().newTransformer();
DOMResult domResult = new DOMResult();
identityTransform.transform(soapBody.getPayloadSource(), domResult);

Node bodyContent = domResult.getNode(); // modify this

identityTransform.transform(new DOMSource(bodyContent), soapBody.getPayloadResult());
Run Code Online (Sandbox Code Playgroud)

我很想看到更好的方法.