【发布时间】:2019-04-02 19:55:57
【问题描述】:
我有一个RestController,多个合作伙伴使用它来发送 XML 请求。然而,这是一个遗留系统,它被传递给了我,并且最初的实现是在 PHP 中以非常松散的方式完成的。
这使得现在他们拒绝更改的客户可以发送不同的content-types(application/xml、text/xml、application/x-www-form-urlencoded),这让我需要支持许多MediaTypes避免返回 415 MediaType Not Supported 错误。
我在配置类中使用了以下代码来允许多种媒体类型。
@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 到达控制器操作为空。
【问题讨论】:
标签: spring-boot spring-mybatis media-type