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

如何使用Spring启动抛出自定义异常而不是500

爱炯
2023-03-14

我试图抛出一个自定义的异常(即400与一些错误消息)从Spring引导控制器,不知何故它总是抛出500而不是

{
  "timestamp": "2021-01-06T17:39:49.648+0000",
  "status": 500,
  "error": "Internal Server Error",
  "message": "invalid xxx",
  "path": "/abc/def"
}

我创建了一个异常处理程序来处理从控制器调用的服务引发的自定义异常,该控制器假定返回400。当我调试它时,我可以看到它实际上已被调用,但它没有作为响应直接抛出,如果我进行调试,我可以看到BasicErrorController仍将被调用(我认为不应该这样,因为我有一个自定义的异常处理程序,请纠正我的错误),此时,我可以看到响应的状态已更改为500,并且我的自定义异常已被此“内部服务器错误”包装

@ControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class RegistrationExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = RegistrationException.class)
    protected ResponseEntity<Object> handleRegistrationError(RegistrationException ex){
        return  ResponseEntity.status(HttpStatus.BAD_REQUEST)
                .contentType(MediaType.APPLICATION_JSON)
                .body(ex);
    }



我已经配置了我的应用程序类来扫描这个处理程序类,我认为它正在工作,因为它将在服务抛出RegistrationException时被调用。

在我的服务中,我调用这个并将异常级联到控制器,抛出新的注册异常(“无效xxx”);

不知道我哪里做错了。我希望看到400个,如下所示。请告知。谢谢

{
  "timestamp": "2021-01-06T17:39:49.648+0000",
  "status": 400,
  "error": "Bad Request",
  "message": "invalid xxx",
  "path": "/abc/def"
}

共有2个答案

谭奕
2023-03-14

您应该使用ControllerAdvice全局处理它们,因为ExceptionHandler是基于控制器的(参见下面链接的Spring博客中的基于控制器的异常处理)

@ControllerAdvice
class GlobalControllerExceptionHandler {
    @ResponseStatus(HttpStatus.BAD_REQUEST)  // 400
    @ExceptionHandler(RegistrationException.class)
    public void handleConflict() {
        // Nothing to do
    }
}

在全局异常处理中使用Spring博客

陈瀚玥
2023-03-14

异常处理程序(ExceptionHandler)仅在其所在的控制器类中工作。

 类似资料:
  • 请问在Spring webflux中抛出选中的自定义异常的正确方法是什么?我想坚持,这是关于检查自定义异常,如MyException。java,而不是RuntimeException,它是关于抛出异常,而不是处理异常。 我尝试了以下方法: 这是不可能的,因为get秒dStepFromFirstStepAfterCheck方法中存在未处理的异常。 如果我抛出并传播,私有的SecondStep get

  • 问题内容: 考虑以下代码: 无需添加方法签名即可编译该代码。(它与同样表现到位,太)。 我理解为什么 可以 安全地运行它,因为实际上不能将其引发在块中,因此不能引发已检查的异常。我有兴趣知道在何处指定此行为。 并非永远都不会达到目标:以下代码也会编译: 但是,如果抛出一个检查的异常,它不会像我期望的那样编译: 在JLS Sec 11.2.2中 ,它说: 一,其抛出的表达式语句(§14.18)具有静

  • "CATCH"应该严格地在"扔"之后叫吗?" 例1: 错误: 找不到方法“接收器”:没有方法缓存,也没有^在/tmp/739536251/main块中查找_方法。pl6第11行 例2: 无误

  • 本文向大家介绍Java抛出异常与自定义异常类应用示例,包括了Java抛出异常与自定义异常类应用示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java抛出异常与自定义异常类。分享给大家供大家参考,具体如下: 异常处理常用方法: 常用的异常处理方法有: 一、try()catch() 语句 二、throw / throws 语句 三、自定义异常类 用途: 众所周知,当程序运行过程中,如果遇

  • 在你可以捕获异常之前,一些代码必须抛出一个异常。任何代码都可能会抛出异常:您的代码,来自其他人编写的包(例如Java平台附带的包)或Java运行时环境的代码。无论是什么引发的异常,它总是通过 throw 语句抛出。 您可能已经注意到,Java平台提供了许多异常类。所有类都是Throwable类的后代,并且都允许程序区分在程序执行期间可能发生的各种类型的异常。 您还可以创建自己的异常类来表示在您编写

  • 我有一个Android应用程序,它带有自定义对象,实现了可Parcelable接口。我设置它的方法是,我的程序最初从包中的文件创建一个自定义类的。我可以看到并确认arraylist和它的实例变量被适当地填充。这个类有几个实例变量,其中一个是另一个,但带有类。记住这个事实。 我正在尝试将传递到一个新活动中,如下所示: 我正在收集新活动中的意图返回的信息,方法是使用以下方法取出 因此这可以很好地工作而