Spring 4.1.3纯文本接口返回415不支持媒体类型问题
问题根因
该415错误由Spring 4.1.3版本的默认实现逻辑、原生Spring MVC与Spring Boot的配置差异共同导致:
- Spring 4.1.3原生环境(非Spring Boot)下,
RequestMappingHandlerAdapter默认注册的StringHttpMessageConverter(负责String类型请求、响应的序列化与反序列化),通过无参构造初始化时仅声明支持*/*(全类型匹配),没有显式注册text/plain类型的读写支持。当你在@RequestMapping注解上显式指定consumes = MediaType.TEXT_PLAIN_VALUE时,Spring的媒体类型校验逻辑会要求匹配到的消息转换器显式声明对该媒体类型的支持,*/*的通配配置不会通过严格校验,因此直接抛出Unsupported Media Type错误。 - Spring Boot环境下相同代码可正常运行,是因为Boot的Web层自动配置会主动修改
StringHttpMessageConverter的支持媒体类型列表,显式加入text/plain的读写支持,同时调整了媒体类型匹配的逻辑,因此不会触发校验失败。 - 用自定义POJO接收JSON参数可正常运行,是因为负责JSON序列化的
MappingJackson2HttpMessageConverter默认配置下就显式声明了对application/json类型的精确支持,匹配校验可以正常通过。 - 补充:该问题属于Spring 4.1.x系列的已知配置缺陷,在Spring 4.2及后续版本中,
StringHttpMessageConverter默认就会将text/plain加入支持媒体类型列表,高版本原生Spring MVC也不会触发该错误。
适配方案
以下方案均可在Spring 4.1.3版本下实现纯文本String类型参数的正常收发,可根据业务场景选择:
- 方案1:显式配置StringHttpMessageConverter的支持媒体类型(最推荐,不改变原有接口语义)
通过Spring MVC的配置入口手动注册StringHttpMessageConverter,显式声明对text/plain类型的支持,覆盖默认的转换器配置即可。
Java配置示例:
XML配置示例:@Configuration @EnableWebMvc public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { // 初始化String转换器,指定UTF-8编码避免中文乱码 StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8); // 显式加入text/plain支持 stringConverter.setSupportedMediaTypes(Arrays.asList( MediaType.TEXT_PLAIN, MediaType.ALL )); converters.add(stringConverter); // 补充注册项目需要的其他消息转换器,比如JSON转换器 converters.add(new MappingJackson2HttpMessageConverter()); } }<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8"/> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> <value>*/*</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> - 方案2:移除接口上的consumes限制
如果业务上不需要严格校验请求的Content-Type头,可以直接去掉@RequestMapping中的consumes = MediaType.TEXT_PLAIN_VALUE配置,此时Spring会走通配符匹配逻辑,直接使用默认的StringHttpMessageConverter处理请求,不会触发415错误。 - 方案3:调整参数接收方式,符合HTTP规范
按照HTTP协议语义,GET请求用于资源查询,不应该携带请求体,部分网络代理、Web服务器会直接丢弃GET请求的请求体内容。你可以将请求方法改为POST,或者将参数调整为URL查询参数、请求头传递,避开请求体解析的逻辑:
这种写法不依赖请求体的消息转换器解析逻辑,完全不会触发媒体类型校验问题。@RequestMapping(value="/foo", method = RequestMethod.GET, produces= MediaType.TEXT_PLAIN_VALUE) public String foo(@RequestParam("data") String data) { return data; }
内容的提问来源于stack exchange,提问作者WishIWasJeeping
相关产品推荐
相关产品推荐

