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