gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:42:06 26 4
gpt4 key购买 nike

我正在尝试为 Web 服务编写一个拦截器,该拦截器将在 Soap 消息发送到端点之前修改其内容。如果客户端发送了一条消息,其中某个元素的值为 1,我希望能够将该元素更改为 2,以便当消息到达端点时,看起来好像客户端提交了 2 而不是1. 我不确定这是一项让我难以完成的艰巨任务,还是一项简单的任务,但我正在使它变得比需要的更难。

我已经逐步了解了一些 Spring 拦截器;但是验证和日志记录拦截器不会每次都更改传输中的消息。 Wss4jSecurityInterceptor 确实向 MessageContext 添加了一些属性;但我无法利用它正在做的任何事情。我有一个拦截器的外壳;但没有任何东西在做任何有值(value)的事情。

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

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

return true;
}

我希望有其他人已经解决了这个特定问题的机会。任何见解将不胜感激。谢谢。

最佳答案

修改负载有点棘手。我发现使这项工作起作用的唯一方法是在 SoapBody 上使用 getPayloadSource()getPayloadResult() 方法,它们公开了 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());

我很乐意看到更好的方法。

关于java - Spring Soap 拦截器如何修改消息的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3207163/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com