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

使用全局异常处理程序在SpringBoot应用程序中处理BindException

闽高峯
2023-03-14

我有一个带post请求的控制器。我试图用一个简单的NotNull注释验证POJO。我正在使用ControllerAdvice来处理异常。

@PostMapping("/something")
public MyResponse post(@Valid MyRequest request) {
   // nevermind...
}
public class MyRequest {
  @NotNull
  private Integer something;
  // Getters setters nevermind...
}
@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler(value = BindException.class)
    protected ResponseEntity<Object> handleBindException(RuntimeException ex, WebRequest request) {
        return handleExceptionInternal(...);
    }
}

所以我尝试使用它,但当我启动应用程序时,我得到了以下信息:

org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerExceptionResolver]: Factory method 'handlerExceptionResolver' threw exception; nested exception is java.lang.IllegalStateException: Ambiguous @ExceptionHandler method mapped for [class org.springframework.validation.BindException]: {protected org.springframework.http.ResponseEntity com.liligo.sponsoredads.controller.RestResponseEntityExceptionHandler.handleBindException(java.lang.Exception,org.springframework.web.context.request.WebRequest), public final org.springframework.http.ResponseEntity org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler.handleException(java.lang.Exception,org.springframework.web.context.request.WebRequest) throws java.lang.Exception}

因此,我想为BindException创建自己的处理程序,但当我为BindException类创建ExceptionHandler时,spring应用程序不会启动。如果我注释掉handleBindException方法,应用程序就会启动,如果发生BindException,它只会返回400并注销错误,但不会将任何内容作为响应正文发回。

为BindExceptions创建自定义处理程序的解决方案可能是什么?

共有1个答案

越正阳
2023-03-14

我发现问题是因为ResponseEntityExceptionHandler已经有了处理BindExceptions的方法。这意味着您不能“重写”对此的异常处理。许多异常也是如此(请参见ResponseEntityExceptionHandler类:106)。因此,如果要创建自己的绑定异常处理程序,则需要重写在超类中处理它的方法。看起来是这样的:

@Override
    protected ResponseEntity<Object> handleBindException(BindException ex, HttpHeaders headers,
                                                         HttpStatus status, WebRequest request) {
    return handleExceptionInternal(...);
}

有了它,你可以归还任何你需要的东西。所以我只找到了这个解决方案,如果有人认识其他人,请毫不犹豫地写在这里:)

 类似资料:
  • 问题内容: 有没有一种方法可以在Java中创建全局异常处理程序。我想这样使用: 处理程序可能无法捕获在主体中引发的异常。 马丁 问题答案: 使用Thread.setDefaultUncaughtExceptionHandler。有关示例,请参见Rod Hilton的“ Global Exception Handling ”博客文章。

  • 我参考了几篇文章来使用为使用Spring的rest api项目创建全局异常处理程序。这样做的目的是在发生异常的情况下向客户端发送正确的格式化响应。在一些文章中,他们在全局异常处理程序中添加了或。我是否应该用替换它,因为此块用于运行时发生的异常? 异常处理程序代码: 错误响应代码: null

  • 本文向大家介绍springboot全局异常处理详解,包括了springboot全局异常处理详解的使用技巧和注意事项,需要的朋友参考一下 一、单个controller范围的异常处理 说明: 在controller中加入被@ExceptionHandler修饰的类即可(在该注解中指定该方法需要处理的那些异常类) 该异常处理方法只在当前的controller中起作用 二、全部controller范围内起

  • 我是一个有Spring和Spring靴的新手。在创建了一个简单的REST API来对用户执行CRUD操作之后,我还创建了自定义的异常处理程序来捕获应用程序中发生的任何异常。这是我写的代码 controller类 使用@ControllerAdvice注释的异常处理程序类 但是,当发生任何异常时,应用程序将被重定向到/error page,而不是由异常处理程序类处理。谁能给出正确的方法来做这件事。

  • 我有一个Groovy Spring Boot微服务,它返回一个帖子列表。请求进入控制器,控制器调用服务类中的方法,如果没有找到POST,则抛出自定义错误消息。 我已经创建了一个带有@ControllerAdvice注释的控制器,我想截获错误,并创建了一个特定于自定义错误的处理程序。它应该返回一个POJO。目前正在调用ControllerAdvice处理程序,但来自microservice的响应是5

  • 问题内容: 我有一个应用程序,需要编写一个自定义的全局未捕获的异常处理程序。我已经阅读了所有stackoverflow线程,并且其中每个线程都只是缺少一个清晰而简单的示例,说明了如何实现这一点。 考虑以下简单示例: 它抛出一个标准异常,它只是一个标准输出。我如何实现自己的异常,该异常可以通过将错误输出到日志文件中的简单方法覆盖标准异常?显然,实际的应用程序要大得多,我们正在谈论未捕获的异常,这就是