Spring Boot无参数请求报415 Unsupported Media Type问题
问题场景与需求
现有如下Spring Boot的RestController:
@AllArgsConstructor @RestController @RequestMapping(value = "/foo", produces = APPLICATION_JSON_VALUE) @Api(value = "restController ") class RestController { private final Service service; @PostMapping(value = "/foo", consumes = {MULTIPART_FORM_DATA_VALUE}) public ResponseDTO foo( @ModelAttribute RequestDTO dto ) { return service.foo(dto); } }
对应的请求DTO RequestDTO:
@Data @NoArgsConstructor @AllArgsConstructor public class RequestDTO { private MultipartFile file; private SomeOtherObject someOtherObject; }
问题现象
当发送无参数请求时,系统抛出HttpMediaTypeNotSupportedException,日志报错:
.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type '' not supported]
接口直接返回415 Unsupported Media Type响应,无法进入接口方法内部对RequestDTO的字段(如file)做自定义校验并返回提示。
约束条件
- 使用Spring Boot 2.7.4版本
- 不通过全局异常处理解决问题
- 必须使用
@ModelAttribute而非@RequestBody - 曾尝试更换媒体类型,未解决问题
解决方案
要让无参数请求进入接口方法,核心是让Spring在请求无Content-Type时也能正常解析@ModelAttribute对象,可通过以下两种方式实现:
方式1:修改@PostMapping的consumes属性
在consumes中添加MediaType.ALL_VALUE,让Spring接受任何Content-Type(包括空值)的请求,从而进入方法处理:
@PostMapping(value = "/foo", consumes = {MULTIPART_FORM_DATA_VALUE, MediaType.ALL_VALUE}) public ResponseDTO foo( @ModelAttribute RequestDTO dto ) { // 自定义字段校验逻辑 if (dto.getFile() == null) { return new ResponseDTO("文件不能为空"); } return service.foo(dto); }
方式2:自定义HttpMessageConverter处理空Content-Type请求
创建自定义消息转换器,允许处理空Content-Type的请求:
@Component public class EmptyContentTypeConverter extends FormHttpMessageConverter { @Override public boolean canRead(Class<?> clazz, MediaType mediaType) { // 允许解析空Content-Type的请求 return mediaType == null || super.canRead(clazz, mediaType); } }
注册该转换器后,Spring会在遇到空Content-Type时用它解析参数,请求就能进入接口方法,之后即可执行自定义校验逻辑。
关键说明
- 添加
MediaType.ALL_VALUE后,Spring不会因空Content-Type直接抛出415异常,会尝试用合适的转换器解析参数,即使无参数也能实例化RequestDTO并传入方法。 - 进入方法后,可通过手动判断字段或结合
@Valid+BindingResult实现校验,返回自定义提示。
内容的提问来源于stack exchange,提问作者Serwur
相关产品推荐
相关产品推荐

