如何自定义 DefaultHandlerExceptionResolver 逻辑?

Rom*_*nov 7 java spring exception-handling spring-mvc spring-boot

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

构建.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')
}
Run Code Online (Sandbox Code Playgroud)

应用程序.java

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')
}
Run Code Online (Sandbox Code Playgroud)

鼠标.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

CustomExceptionHandlerResolver.java

@Value
public class Mouse {
    private final Long id;
    @NotEmpty
    @Min(2)
    private final String name;
}
Run Code Online (Sandbox Code Playgroud)

封装结构

.
??? 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
Run Code Online (Sandbox Code Playgroud)

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

POST localhost:8080/mouse?name=1
Run Code Online (Sandbox Code Playgroud)

handleBindException()方法 inDefaultHandlerExceptionResolver被调用但不在我的CustomExceptionHandlerResolver.

我该如何处理BindException我的CustomExceptionHandlerResolver

Ken*_*han 7

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

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

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

@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();
    }

}
Run Code Online (Sandbox Code Playgroud)