【问题标题】:How to customize DefaultHandlerExceptionResolver logic?如何自定义 DefaultHandlerExceptionResolver 逻辑?
【发布时间】:2019-05-27 04:36:48
【问题描述】:

我想在我的 Spring Boot 应用程序中自定义 DefaultHandlerExceptionResolver,但发生异常时从未达到自定义实现。

build.gradle

buildscript {
    ext {
        springBootVersion = '2.1.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
}

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.1.1.RELEASE'
    id 'io.spring.dependency-management' version '1.0.6.RELEASE'
    id 'io.franzbecker.gradle-lombok' version '1.14'
}

lombok {
    version = '1.18.4'
    sha256 = ""
}

group = 'ua.com.javaman'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
}

Application.java

@SpringBootApplication
@RestController
@Configuration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @ResponseBody
    @PostMapping("/mouse")
    public Mouse postMouse(@Valid Mouse mouse) {
        // mouse creation logic
        return mouse;
    }

    @Bean
    public HandlerExceptionResolver customHandlerExceptionResolver() {
        return new CustomExceptionHandlerResolver();
    }
}

Mouse.java

@Value
public class Mouse {
    private final Long id;
    @NotEmpty
    @Min(2)
    private final String name;
}

CustomExceptionHandlerResolver.java

public class CustomExceptionHandlerResolver extends DefaultHandlerExceptionResolver {
    @Override
    protected ModelAndView handleBindException(
        BindException ex, HttpServletRequest request, HttpServletResponse response, @Nullable Object handler
    ) throws IOException {
        System.out.println("In CustomExceptionHandlerResolver");
        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
        return new ModelAndView();
    }
}

包结构

.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── LICENSE
├── README.md
├── settings.gradle
└── src
    └── main
        └── java
            └── ua
                └── com
                    └── javaman
                        └── exception_handling
                            ├── Application.java
                            ├── CustomExceptionHandlerResolver.java
                            └── Mouse.java

当我使用错误的 Mouse 实体值调用应用程序时,例如,

POST localhost:8080/mouse?name=1

DefaultHandlerExceptionResolver 中的handleBindException() 方法被调用,但在我的CustomExceptionHandlerResolver 中没有被调用。

如何用我的CustomExceptionHandlerResolver 处理BindException

【问题讨论】:

  • 你在CustomExceptionHandlerResolver上错过了@Component
  • @Deadpool 添加@Component 没有解决我的问题
  • 同时显示包结构
  • @Deadpool 我添加了包结构

标签: java spring spring-mvc spring-boot exception-handling


【解决方案1】:

SpringBoot 的自动配置将始终默认创建a bunch of exception handlers,其中一个是DefaultHandlerExceptionResolver,顺序为0(值越小优先级越高)。默认情况下,您的处理程序的优先级低于这些 default ,因此不会调用它,因为默认情况下已经处理了异常。

您可以使用WebMvcConfigurer 实现您的配置类并覆盖extendHandlerExceptionResolvers() 以修改默认设置。我们的想法是找出 DefaultHandlerExceptionResolver 实例并将其替换为您的实例。

但更好的主意是用 @ControllerAdvice 定义您的 CustomExceptionHandlerResolver ,这样可以确保您不会弄乱默认设置,同时仍然添加您想要的自定义行为(即使用您的逻辑来处理 @987654328 @):

@Component
@ControllerAdvice
public class CustomExceptionHandlerResolver {

    @ExceptionHandler(value= BindException.class)
    @Override
    protected ModelAndView handleBindException(
            BindException ex, HttpServletRequest request, HttpServletResponse response, @Nullable Object handler)
            throws IOException {
        System.out.println("In CustomExceptionHandlerResolver");
        response.sendError(HttpServletResponse.SC_BAD_REQUEST);
        return new ModelAndView();
    }

}

【讨论】:

  • @Order(Ordered.HIGHEST_PRECEDENCE) 或其他一些自定义顺序可用于确保异常处理程序优先。
  • 实现 order 小于 0 的 Ordered 接口可以优先于那些 default 。但确切地说,有多个默认异常处理程序,顺序为 0,而您的自定义异常处理程序基本上将处理所有异常。如果您使您的处理程序具有高于这些默认值的优先级,您将覆盖一些默认异常处理行为,例如作为那些@ExceptionHandler.....
  • DefaultHandlerExceptionResolver 在春季 5.3.3 中有订单 Ordered.LOWEST_PRECEDENCE
猜你喜欢
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多