我需要编写一个相当通用的RESTful Spring Boot微服务,以将某些请求路由到各种其他API。需求之一意味着使服务能够接收SOAP消息请求。我的代码REST Controller代码如下。这只是一个简单的构建,其中的虚拟服务做了一些琐碎的事情,但最终应该返回SOAPMessage的响应。其他要求围绕解释更具RESTful性质的请求,但是我在这里遇到的问题是让它接受我的SOAPMessage请求有效负载。我也尝试过SOAPEnvelope。
在我的IDE中本地构建和运行它时,点击此服务后,出现以下错误:
2019-06-12 17:34:42.608 WARN 20320 --- [nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/xml;charset=UTF-8' not supported]
2019-06-12 17:34:42.608 DEBUG 20320 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed 500 INTERNAL_SERVER_ERROR
我使用的SOAP请求特别简单:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<Hello>Goodbye</Hello>
</soapenv:Body>
</soapenv:Envelope>
对此,任何帮助将不胜感激。
非常感谢 丰富
一个简单的解决方法是将SOAPMessage转换为String类型。这种方法工作正常,但显然不是理想的方法,并且很容易受到SQL注入攻击的侵害,但这不是正确的处理方法。
此外,鉴于该错误抱怨Content-Type(不支持内容类型'text / xml; charset = UTF-8')。我尝试更改Content-Type标头,但这也没有给出任何不同的结果。我看到过类似的帖子,其中缺少对JSON负载请求的一种依赖关系。但是,这仅适用于XML请求,因此我无法将此处建议的任何解决方法应用于我的特定问题。
package com.controller;
import javax.xml.soap.SOAPMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.service.ParserService;
import com.service.RouterService;
import com.service.ValidatorService;
@RestController
public class Controller {
@Value("${spring.profiles}")
private String environment;
@Autowired
private ValidatorService validatorService;
@Autowired
private ParserService parserService;
@Autowired
private RouterService routerService;
@PostMapping
public ResponseEntity<SOAPMessage> post(@RequestBody SOAPMessage rqBody) throws Exception {
SOAPMessage rs = null;
if (validatorService.validateRequest(rqBody)) {
String consumer = validatorService.validateConsumer(rqBody);
if (!consumer.isEmpty()) {
String outBoundRouteUrl = parserService.getOutboundRouteUrl(rqBody, consumer, environment);
rs = routerService.postRequest(rqBody, outBoundRouteUrl);
} else {
// ...throw exception
}
} else {
// ...throw exception
}
return ResponseEntity.ok().body(rs);
}
}