Как настроить логику DefaultHandlerExceptionResolver? - PullRequest
0 голосов
/ 30 декабря 2018

Я хочу настроить DefaultHandlerExceptionResolver в своем приложении Spring Boot, но пользовательская реализация не была достигнута при возникновении исключения.

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

, чем handleBindException() метод в DefaultHandlerExceptionResolver вызывается, но не в моем CustomExceptionHandlerResolver.

Как я могу обработать BindException с моим CustomExceptionHandlerResolver?

1 Ответ

0 голосов
/ 30 декабря 2018

Автоматическая конфигурация SpringBoot всегда создает группу обработчиков исключений по умолчанию, один из которых DefaultHandlerExceptionResolver в порядке 0 (более низкое значение имеет более высокий приоритет).Ваш обработчик по умолчанию будет иметь более низкий приоритет, чем эти по умолчанию, поэтому он не будет вызываться, так как исключение уже обработано по умолчанию.

Вы можете реализовать свой класс конфигурации с помощью WebMvcConfigurer и переопределить exteHandlerExceptionResolvers () , чтобы изменить настройки по умолчанию.Идея состоит в том, чтобы найти экземпляр DefaultHandlerExceptionResolver и заменить его своим.

Но лучшая идея состоит в том, чтобы определить ваш CustomExceptionHandlerResolver с помощью @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();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...