将SOAPMessage传递给RESTful Spring Boot应用程序时出现HttpMediaTypeNotSupportedException

时间:2019-06-12 16:41:59

标签: rest spring-boot soap

我需要编写一个相当通用的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);
        }
    }

0 个答案:

没有答案