Spring中如何自定义@RequestBody缺失时的错误提示信息?
解决@RequestBody缺失时的错误信息定制问题
当接口标注@RequestBody @Valid但调用时省略请求体,Spring默认返回的错误详情会包含完整方法签名,我们可以通过以下两种方式将错误信息简化为Required request body is missing:
方案一:全局异常处理器(推荐)
通过@RestControllerAdvice定义全局异常处理器,精准捕获请求体缺失的异常并定制返回信息:
import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.HashMap; import java.util.Map; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity<Map<String, Object>> handleRequestMissingBody(HttpMessageNotReadableException ex) { Map<String, Object> errorResp = new HashMap<>(); errorResp.put("title", "Failed to parse request"); // 仅针对请求体缺失的场景替换消息 if (ex.getMessage() != null && ex.getMessage().startsWith("Required request body is missing")) { errorResp.put("detail", "Required request body is missing"); } else { // 其他请求体解析错误保留原消息 errorResp.put("detail", ex.getMessage()); } errorResp.put("status", HttpStatus.BAD_REQUEST.value()); return new ResponseEntity<>(errorResp, HttpStatus.BAD_REQUEST); } }
该方案的优势是可以区分不同的HttpMessageNotReadableException场景(比如请求体格式错误和请求体缺失),仅在目标场景下替换消息,不影响其他错误的提示逻辑。
方案二:自定义消息源全局替换
Spring的默认错误消息存储在内置的Messages.properties中,我们可以通过自定义消息源覆盖请求体缺失的默认提示:
- 在项目
resources目录下创建messages.properties文件,添加:
http.message.not_readable=Required request body is missing
- 配置自定义
MessageSource:
import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ReloadableResourceBundleMessageSource; @Configuration public class MessageConfig { @Bean public MessageSource messageSource() { ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); messageSource.setBasename("classpath:messages"); messageSource.setDefaultEncoding("UTF-8"); // 设置优先级高于内置消息源 messageSource.setUseCodeAsDefaultMessage(false); return messageSource; } }
注意:这种方式会全局替换所有HttpMessageNotReadableException的错误消息,包括请求体格式解析失败等场景,适合需要统一所有该类型异常提示的场景。
内容的提问来源于stack exchange,提问作者chimera_girl
相关产品推荐
相关产品推荐

