spring 使用哪个模型类来响应请求映射方法的错误?

Vik*_*sad 4 java spring exception-handling response spring-mvc

我正在为我的@RequestMapping方法的自定义错误场景设计一个 POJO 。

Spring 默认抛出 a HttpMessageNotReadableExceptionif a POSTis made without any body 并很好地返回错误响应,如下所示:

{
    "timestamp": "2017-07-28T18:54:11.867+0000",
    "status": 400,
    "error": "Bad Request",
    "exception": "org.springframework.http.converter.HttpMessageNotReadableException",
    "message": "Required request body is missing: public org.springframework.http.ResponseEntity<some.package.name.SomeResponseClass> some.package.name.SomeControllerClass.someRequestMappingMethod(java.util.Map<java.lang.String, java.lang.String>, some.package.name.SomeRequestClass)",
    "path": "/somepath/"
}
Run Code Online (Sandbox Code Playgroud)

类似地,如果对任何注释的字段的验证@Valid失败,它会抛出MethodArgumentNotValidException并返回错误响应,如下所示:

{
    "timestamp": "2017-07-28T17:23:53.102+0000",
    "status": 400,
    "error": "Bad Request",
    "exception": "org.springframework.web.bind.MethodArgumentNotValidException",
    "errors": [
        {
            "codes": [
                "NotNull.incident.someField",
                "NotNull.someField",
                "NotNull.java.lang.String",
                "NotNull"
            ],
            "arguments": [
                {
                    "codes": [
                        "someObject.someField",
                        "someField"
                    ],
                    "arguments": null,
                    "defaultMessage": "someField",
                    "code": "someField"
                }
            ],
            "defaultMessage": "someField is null",
            "objectName": "someObject",
            "field": "someField",
            "rejectedValue": null,
            "bindingFailure": false,
            "code": "NotNull"
        }
    ],
    "message": "Validation failed for object='someObject'. Error count: 2",
    "path": "/somepath/"
}
Run Code Online (Sandbox Code Playgroud)

我有一个理解,在上述任何一种情况下,Spring 都必须返回一个ResponseEntity包含标题和正文的对象。而且必须有代表具有类似上面即场人体模型类timestampstatuserror等我只是希望访问该类得到一个什么样的所有字段春天纳入到自己的错误响应模型的想法。或者我可能想扩展它。现在我已经花了相当多的时间来搜索那个类,但找不到。

我能找到的最好的是ResponseEntityExceptionHandler#handleException(),但我的调试器甚至不会在那里设置的断点处运行!!

任何人都可以指出它存在的包吗?

Evg*_*rov 5

对于 Spring Boot 1.5.2.RELEASE / Spring 4.3.7

这是一个LinkedHashMap<String, Object>.

通过搜索 ErrorController 找到它 - 有一个类 org.springframework.boot.autoconfigure.web.BasicErrorController

error当发生错误时调用它的方法,它看起来像这样:

@RequestMapping
@ResponseBody
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
    Map<String, Object> body = getErrorAttributes(request,
            isIncludeStackTrace(request, MediaType.ALL));
    HttpStatus status = getStatus(request);
    return new ResponseEntity<Map<String, Object>>(body, status);
}
Run Code Online (Sandbox Code Playgroud)

您可以深入getErrorAttributes了解该方法以了解 Map 的构建方式。