当前位置: 首页 > 知识库问答 >
问题:

自定义Spring Boot错误响应代码而不更改默认正文

苏鸿卓
2023-03-14

Spring Boot默认情况下返回一个满足我开箱即用需求的异常响应正文:

{
    "timestamp": 1587794161453,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "javax.persistence.EntityNotFoundException",
    "message": "No resource exists for the given ID",
    "path": "/my-resource/1"
}

但是,我希望为应用程序引发的不同类型的异常自定义响应代码。有些异常不是我自己的,所以我不能在异常类上添加@responsestatus注释。我尝试使用@ExceptionHandler方法和@ResponseStatus,但这是覆盖响应正文,我不希望发生这种情况。例如,我希望将javax.persistence.EntityNotFoundException映射为返回状态代码404。

@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
public void handleEntityNotFoundException(EntityNotFoundException e) {
    // This method returns an empty response body
}

共有1个答案

施季
2023-03-14

事实证明,我提到的问题的这个答案有解决这个问题所需的精确解,尽管它并不完全符合所问的问题。技巧是从方法中删除@responsestatus的使用,并使用httpservletresponse.senderroror()手动设置httpservletresponse的状态。这服务于标准的Spring Boot异常响应,但使用更新的状态代码。

@ExceptionHandler
public void handleEntityNotFoundException(EntityNotFoundException e, HttpServletResponse response) throws IOException {
    response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
{
    "timestamp": 1587794161453,
    "status": 404,
    "error": "Not Found",
    "exception": "javax.persistence.EntityNotFoundException",
    "message": "No resource exists for the given ID",
    "path": "/my-resource/1"
}
 类似资料:
  • Apache可以让网站管理员自己自定义对一些错误和问题的响应。 自定义的响应可以定义为当服务器检测到错误或问题时才被激活。 如果一个脚本崩溃并产生"500 Server Error"响应,那么这个响应可以被更友好的提示替换或者干脆用重定向语句跳到其他的URL(本地的或外部的)。 行为 老式的行为 Apache1.3 会响应一些对于用户没有任何意义的错误或问题信息,而且不会将产生这些错误的原因写入日

  • 问题内容: 当前,来自spring boot的错误响应包含如下标准内容: 我正在寻找一种方法来消除响应中的“ exception”属性。有没有办法做到这一点? 问题答案: 如有关错误处理的文档中所述,您可以提供自己的bean,该bean实施以控制内容。 一个简单的方法就是继承。例如:

  • 当通过URL调用我的Web应用程序中不存在的项目时,Spring会使用JSON响应,其中包含(时间、状态、错误、消息、路径)等数据。所以,我需要更改这个JSON的结构,特别是我需要删除路径。我该怎么做?我应该在我的项目中在哪里实现异常的自定义?向大家问好! json响应修改

  • 给Rest服务打电话 http://acme.com/app/widget/123 返回: 此客户端代码的工作原理是: 但是,http://acme.com/app/widget/456返回: 但此客户端代码引发了一个异常: 我试过: 第二次调用只是抛出了另一个HttpClientErrorException,而且它觉得调用服务两次是不对的。 是否有一种方法可以调用该服务一次,并在成功时将响应解析

  • 请帮助我了解我应该在哪里更新失败案例的实际合同?