【问题标题】:How to standardize REST errors in a JHipster app?如何标准化 JHipster 应用程序中的 REST 错误?
【发布时间】:2016-03-01 20:14:54
【问题描述】:

我已经使用 JHipster 作为起始模板构建了一个应用程序。

JHipster 提供了一个ExceptionTranslator 类,用@ControllerAdvice 注释,它对控制器中客户端请求产生的错误进行异常处理。此类将异常类型映射到方法,每个方法构建并返回一个 ErrorDTO 类型的对象,然后将其序列化为 JSON 并发送到客户端。我为一个简单的用例添加了自己的方法:

@ExceptionHandler(IllegalArgumentException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorDTO processIllegalArgumentException(IllegalArgumentException exception) {
    return new ErrorDTO(ErrorConstants.ERR_VALIDATION, exception.getMessage());
}

它工作得很好,如果发生错误(在这种情况下是一个太短的值)我会在客户端收到这个 JSON:

{
    "message":"error.validation",
    "description":"The request payload that defines the search terms should be at least 3 characters long.",
    "fieldErrors":null
}

但是,当Spring MVC自己在进入控制器之前产生错误时(例如缺少一个必填参数),客户端接收到的json的结构是不同的,例如:

{
    "timestamp":"2015-11-27T15:08:32.897+0000",
    "status":400,
    "error":"Bad Request",
    "exception": "org.springframework.http.converter.HttpMessageNotReadableException",
    "message":"Required request body is missing: public java.lang.String ch.unine.directory.web.rest.SearchResource.search(java.lang.String)",
    "path":"/api/search"
}

Spring Boot/Spring MVC 用来表示错误的类(或其他机制)是什么?如何统一发回给客户端的数据类型以防出错,从而为错误页面提供一个很好的独特模板?

【问题讨论】:

    标签: java spring spring-mvc spring-boot jhipster


    【解决方案1】:

    我在这篇博文中找到了解决方案:http://www.jayway.com/2014/10/19/spring-boot-error-responses/

    @ExceptionHandler 方法中,只需指定状态码,其余的交给Spring处理。它将生成 JSON 响应,其字段与进入控制器之前发生错误时的字段相同:

    @ExceptionHandler
    void handleIllegalArgumentException(IllegalArgumentException e, HttpServletResponse response) throws IOException {
        response.sendError(HttpStatus.BAD_REQUEST.value());
    }
    

    响应正文示例:

    {
        "timestamp": "2015-11-27T16:08:46.148+0000",
        "status": 400,
        "error": "Bad Request",
        "exception": "java.lang.IllegalArgumentException",
        "message": "The request payload that defines the search terms should be at least 3 characters long.",
        "path": "/api/search"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2019-11-17
      • 2019-05-23
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多