如何只改动Spring Boot RestController在exception情况下输出内容的部分字段,而不改写整个响应内容

Spring BootWeb API, 因为项目简单,并不想引入引入一套自己的错误规则,直接让@RestController直接返回repository的查询结果,异常的话就使用默认的异常结果

// 正确
{
    "id": 2,
    "text": "hahahahaha",
    "username": "haha",
    "update_time": 1510896551177
}

// 异常
{
    "timestamp": 1510914077779,
    "status": 405,
    "error": "Method Not Allowed",
    "exception": "org.springframework.web.HttpRequestMethodNotSupportedException",
    "message": "Request method 'DELETE' not supported",
    "path": "/api/message/"
}

// 使用@NotNull、@NotBlank和@valid验证参数错误的时候
{
    "timestamp": 1510914681866,
    "status": 400,
    "error": "Bad Request",
    "exception": "org.springframework.validation.BindException",
    "errors": [
        {
        
            ...
            
            "defaultMessage": "message不能为空",
            
            ...
        }
    ],
}

这里的statuserror内容就是当前的http状态码,用http状态码和defaultMessage?的内容展示异常就够了,所以希望把无关的内容去掉,统一成

// 正确

{
    "status": 405,
    "error": defaultMessage | error
}

可以如何实现

我在@ControllerAdvice这个类里重写输出的话,http状态码又会变回200,也不知道如何保留异常的状态码

阅读 4.3k
2 个回答
@ControllerAdvice
public class GobalExceptionHandler {

    @ResponseBody
    @ExceptionHandler
    // 返回的 HTTP 状态码为 HttpStatus.BAD_REQUEST
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    // 处理某个具体的异常
    public RespCode handleBindException(BindException ex) {
        return RespCode.errorOf(ex.getFieldError().getDefaultMessage());
    }

    @ResponseBody
    @ExceptionHandler
    // 返回的 HTTP 状态码为 HttpStatus.INTERNAL_SERVER_ERROR
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    // 处理全局异常
    public RespCode handleException(Exception ex) {
        ex.printStackTrace(System.err);
        return RespCode.errorOf(ex.getMessage());
    }

}

这样写的 GobalExceptionHandler 会替你处理所有的异常,你可以在 handleException 方法中写上你的逻辑,并返回你想要返回状态码和数据。

推荐问题
宣传栏