You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中,我们可以通过自定义消息源覆盖请求体缺失的默认提示:

  1. 在项目resources目录下创建messages.properties文件,添加:
http.message.not_readable=Required request body is missing
  1. 配置自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:15:33