ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何在JHipster应用程序中标准化REST错误?

2019-06-28 09:07:12  阅读:236  来源: 互联网

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


我使用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用来表示错误的类(或其他机制)是什么?如何在发生错误时统一发送回客户端的数据类型,以便为错误页面提供一个很好的独特模板?

解决方法:

我找到了解决方案,在这篇博客文章中: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"
}

标签:java,spring-mvc,spring,spring-boot-2,jhipster
来源: https://codeday.me/bug/20190628/1313956.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有