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

如何确保@ExceptionHandler(Exception.class)将在Spring Boot中最后调用?

程树
2023-03-14
@RequestMapping(method = RequestMethod.POST, value = "/endpoint")
public ResponseEntity<MyResponse> myEndpoint(@RequestBody MyRequest request) throws Exception {
    //...
}

这样的控制器可能会引发几个异常,为此我使用@exceptionHandler:

@ExceptionHandler(SomeSpecificException.class)
@ResponseBody
public ResponseEntity<Error> handleSomeSpeficicFailure(SomeSpecificException e) {
    //handle specific exception
}

@ExceptionHandler(SomeOtherSpecificException.class)
@ResponseBody
public ResponseEntity<Error> handleSomeOtherSpeficicFailure(SomeOtherSpecificException e) {
    //handle specific exception
}

//etc.

如果抛出的异常不属于任何已知类,我添加了一个泛型exception.class处理程序,它返回一个自定义的500:

@ExceptionHandler(Exception.class)
@ResponseBody
public ResponseEntity<Error> handleUnknownFailure(Exception e) {
    //handle unknown exception
}

做了一些测试,它似乎工作得很好。如果我抛出一个特定的异常,我将在特定的处理程序上调用,如果我抛出一个未映射的异常,我将在泛型处理程序上调用。

  • 有人知道添加@exceptionHandler(exception.class)来处理一般异常是否是一个好的做法吗?如果没有,正确的方法是什么?
  • 如何保证类层次结构得到尊重(例如,如果有一天我有SomeVerySpecificException扩展了SomeSpecificException,SomeSpecificException-direct Parent-beforException-grandparent),那么Spring如何知道它必须在SomeSpecificException调用我?

共有1个答案

终子昂
2023-03-14

经过调试,我在他们的代码中找到了答案--尽管它没有文档化,但这很遗憾。

@Nullable
private Method getMappedMethod(Class<? extends Throwable> exceptionType) {
    List<Class<? extends Throwable>> matches = new ArrayList<>();
    for (Class<? extends Throwable> mappedException : this.mappedMethods.keySet()) {
        if (mappedException.isAssignableFrom(exceptionType)) {
            matches.add(mappedException);
        }
    }
    if (!matches.isEmpty()) {
        matches.sort(new ExceptionDepthComparator(exceptionType));
        return this.mappedMethods.get(matches.get(0));
    }
    else {
        return null;
    }
}

因此,对于给定的异常,它们首先查找MappedException.ISAssignableFrom(exceptionType)所对应的所有映射方法。

创建此列表后,则:

    null
 类似资料:
  • 问题内容: 注意:这旨在作为常见问题的规范答案。 我有一个带有字段()的Spring 类(),但是该字段是我尝试使用它时所用的。日志显示同时创建了bean和bean,但是每当尝试在服务bean上调用方法时,我都会得到一个。Spring为什么不自动接线该领域? 控制器类: 服务等级: 应该自动连接的服务bean,但不是: 当我尝试时,出现以下异常: 问题答案: 带注释的字段是因为Spring不知道您

  • 我有下面的AuthenticationResponse模型,用于使用Reform2的3个api调用。如果我进行verifyEmail调用f.e.,JSON响应主体只包含有效电子邮件的属性(例如{“validEmail”:true})。其他2个调用仅包含“ResetSuccessful”或其他4个调用的属性。 我如何确保/检查收到verifyEmail呼叫f.e.的响应时,它包含validEmail

  • 我有一个用@ControllerAdvice注释的类和用@ExceptionHandler注释的方法来处理服务代码引发的异常。在处理这些异常时,我希望获得@RequestBody,它是请求POST操作的一部分。 我尝试为发送的请求创建POJO类,并尝试在异常处理程序类中检索,但它返回null。 遵循本查询中给出的相同解决方案~如何在@ExceptionHandler(Spring REST)中获取

  • StaticPagerAdapter dummyfragment1 layoutfragment1

  • 问题内容: 我有一个,并且有一个我编写的方法,该方法生成对象并返回其指针。 现在,我还有另一个方法,例如,但是到目前为止,创建对象后并不一定要调用此方法。我想确保如果创建了对象,则必须调用此方法。如何在Golang中做到这一点?如果可能的话,我也不知道这是什么。请帮忙。谢谢。 问题答案: 无法强制调用方法。最好的办法就是清楚地记录下来,如果不再需要类型的值,则必须调用其方法。 在极端情况下,如果程

  • 问题内容: 我在SO上发现了许多类似问题的实例,但不幸的是,没有答案符合我的要求。 我对人像和风景有不同的布局,并且我使用的是后向堆栈,这既妨碍了我的使用,又使我无法使用配置更改例程。 我在TextViews中向用户显示某些信息,这些信息不会保存在默认处理程序中。当仅使用“活动”编写我的应用程序时,以下方法运行良好: 使用,这仅在非常特殊的情况下有效。具体地说,令人震惊的是替换片段,将其放回堆栈中