HttpMediaTypeNotSupportedException при передаче SOAPMessage в приложение RESTful Spring Boot - PullRequest
0 голосов
/ 12 июня 2019

У меня есть требование написать довольно общий микросервис 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>

Любая помощь будет высоко оценена в этом.

Большое спасибо Rich

Простой обходной путь - преобразовать SOAPMessage в тип String.Это работает нормально, но, очевидно, не идеально и может открыть его для атак с использованием SQL-инъекций, и это просто неправильный способ справиться с этим.

Кроме того, учитывая, что ошибка была связана с Content-Type (Content)тип '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);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...