spring-boot - SpringBoot SOAP 服务:SAAJ SOAP 消息没有正文
问题描述
我有一个从 wsdl 构建的 SOAP webservice,带有 Springboot,版本 2.5.2,cxf 版本 3.4.4
我已经单独使用 cxf 构建了一个服务,它就像一个魅力,我想使用 Spring 来构建该服务。
请在下面找到代码:
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "Update")
@SoapAction("http://www.sample.edu/XXPath/IDM/XXIDMService/Update")
@ResponsePayload
public JAXBElement<XXPathServiceResponseType> update
(@RequestPayload UpdateType request,
MessageContext context) throws Exception {
XXPathServiceResponseType resp = new ObjectFactory().createXXPathServiceResponseType();
resp.setCorrelationId(request.getCorrelationId());
QName qname = new QName("http://www.sample.edu/XXPath",
"XXPathServiceResponse");
return new JAXBElement<>(qname, XXPathServiceResponseType.class, resp);
}
我已启用消息验证和安全操作(时间戳签名加密)
下面是我的 pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-security</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<!-- end::dependency[] -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-security</artifactId>
</dependency>
</dependencies>
在点击服务时,我收到错误:
2021-07-22 21:43:39.612 ERROR 19061 --- [-nio-443-exec-6] a.c.c.C.[.[.[.[messageDispatcherServlet] : Servlet.service() for servlet [messageDispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.ws.soap.saaj.SaajSoapBodyException: SAAJ SOAP message has no body] with root cause
org.springframework.ws.soap.saaj.SaajSoapBodyException: SAAJ SOAP message has no body
at org.springframework.ws.soap.saaj.SaajSoapEnvelope.getBody(SaajSoapEnvelope.java:54) ~[spring-ws-core-3.1.1.jar:na]
at org.springframework.ws.soap.AbstractSoapMessage.getSoapBody(AbstractSoapMessage.java:38) ~[spring-ws-core-3.1.1.jar:na]
at org.springframework.ws.soap.AbstractSoapMessage.hasFault(AbstractSoapMessage.java:62) ~[spring-ws-core-3.1.1.jar:na]
at org.springframework.ws.soap.AbstractSoapMessage.getFaultCode(AbstractSoapMessage.java:68) ~[spring-ws-core-3.1.1.jar:na]
at org.springframework.ws.transport.support.WebServiceMessageReceiverObjectSupport.handleConnection(WebServiceMessageReceiverObjectSupport.java:94) ~[spring-ws-core-3.1.1.jar:na]
at org.springframework.ws.transport.http.WebServiceMessageReceiverHandlerAdapter.handle(WebServiceMessageReceiverHandlerAdapter.java:60) ~[spring-ws-core-3.1.1.jar:na]
at org.springframework.ws.transport.http.MessageDispatcherServlet.doService(MessageDispatcherServlet.java:288) ~[spring-ws-core-3.1.1.jar:na]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.8.jar:5.3.8]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.8.jar:5.3.8]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:665) ~[javax.servlet-api-4.0.1.jar:4.0.1]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.8.jar:5.3.8]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) ~[javax.servlet-api-4.0.1.jar:4.0.1]
请帮我解决这个错误。
谢谢,拉维。
解决方案
找到解决方案,以防万一
在加密时,我已经指定了加密部分(正文和时间戳),这就是破坏它的原因。
我已经删除了拦截器中的设置器
securityInterceptor.setSecurementEncryptionParts();
出于某种原因,Spring 正在采用 SAAJ 并且没有将我在端点中设置的响应附加到 SAAJ 正文并且加密失败
推荐阅读
- ruby-on-rails - 卡住试图连接到我的 mongodb 服务器
- spring-boot - 从 SpringFox 迁移到 SpringDoc 后得到“为 '/v3/api-docs' 映射的模糊处理程序方法”
- javascript - 如何为书签获取超过 2k 个字符的外部 js 代码?
- java - 在实时数据库(Firebase)中获得喜欢系统的正确方法是什么
- mingw-w64 - 交叉编译 SystemC 库并链接到它们
- drupal - 以编程方式更新节点图像字段后清除缓存
- php - SDK 解析器找不到路径
- ruby-on-rails - 当我尝试使用 rails new blog 创建项目时遇到问题
- javascript - 我有基本相同的 API 函数将我的前端连接到烧瓶后端。但是为什么一个有效而另一个无效呢?
- java - org.joda.time.DateTime.now 分辨率