У меня есть RestController
, который несколько партнеров используют для отправки запросов XML.Однако это устаревшая система, которую мне передали, и оригинальная реализация была сделана очень свободно в PHP.
Это позволило клиентам, которые теперь отказываются меняться, отправлять различные content-types
(application/xml
, text/xml
, application/x-www-form-urlencoded
), и это оставило мне необходимость поддержки многих MediaTypes
, чтобы избежать возврата 415 MediaType Неподдерживаемые ошибки.
Я использовал следующий код в классе конфигурации, чтобы разрешить много типов носителей.
@Bean
public MarshallingHttpMessageConverter marshallingMessageConverter() {
MarshallingHttpMessageConverter converter = new MarshallingHttpMessageConverter();
converter.setMarshaller(jaxbMarshaller());
converter.setUnmarshaller(jaxbMarshaller());
converter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_OCTET_STREAM, MediaType.APPLICATION_XML,
MediaType.TEXT_XML, MediaType.TEXT_PLAIN, MediaType.APPLICATION_FORM_URLENCODED, MediaType.ALL));
return converter;
}
@Bean
public Jaxb2Marshaller jaxbMarshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setClassesToBeBound(CouponIssuedStatusDTO.class, CouponIssuedFailedDTO.class,
CouponIssuedSuccessDTO.class, RedemptionSuccessResultDTO.class, RedemptionResultHeaderDTO.class,
RedemptionFailResultDTO.class, RedemptionResultBodyDTO.class, RedemptionDTO.class, Param.class,
ChannelDTO.class, RedeemRequest.class);
Map<String, Object> props = new HashMap<>();
props.put(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setMarshallerProperties(props);
return marshaller;
}
Метод контроллера таков:
@PostMapping(value = "/request", produces = { "application/xml;charset=UTF-8" }, consumes = MediaType.ALL_VALUE)
public ResponseEntity<RedemptionResultDTO> request(
@RequestHeader(name = "Content-Type", required = false) String contentType,
@RequestBody String redeemRequest) {
return requestCustom(contentType, redeemRequest);
}
Эта конечная точка пораженавсеми клиентами.Это только один последний клиент, доставляющий мне неприятности.Они отправляют content-type = application/x-www-form-urlencoded; charset=65001 (UTF-8)": 65001 (UTF-8)
Из-за способа отправки кодировки Spring Boot отказывается возвращать что-либо, кроме 415 .Даже MediaType.ALL
, кажется, не имеет никакого эффекта.
Есть ли способ заставить Spring позволить мне достичь этого, игнорируя тип содержимого?Создание фильтра и изменение типа контента было невозможно, так как HttpServletRequest
не позволяет изменять тип контента.У меня нет идей, но я действительно думаю, что должен быть способ разрешить создание пользовательских типов контента.
ОБНОВЛЕНИЕ
Если я удалю @RequestBody
, то яне получаю ошибку 415, но у меня нет способа получить тело запроса, так как HttpServletRequest достигает действия Controller пустым.