java - 如何自定义 DefaultHandlerExceptionResolver 逻辑?
问题描述
我想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')
}
应用程序.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();
}
}
鼠标.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()
方法 inDefaultHandlerExceptionResolver
被调用,但不在 my CustomExceptionHandlerResolver
.
我该如何处理BindException
我的CustomExceptionHandlerResolver
?
解决方案
SpringBoot 的自动配置总是会默认创建一堆异常处理程序,其中一个的DefaultHandlerExceptionResolver
顺序为 0(值越低优先级越高)。默认情况下,您的处理程序的优先级低于这些 default ,因此不会调用它,因为默认情况下已经处理了异常。
WebMvcConfigurer
您可以使用并覆盖extendHandlerExceptionResolvers()来实现您的配置类以修改默认设置。这个想法是找出DefaultHandlerExceptionResolver
实例并将其替换为您的实例。
但是一个更好的主意是定义你的CustomExceptionHandlerResolver
with @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();
}
}
推荐阅读
- c++ - const std::array 成员引用可以用右值初始化吗?
- java - 使用 Spring Data JPA Criteria Query 查找最近的驱动程序
- swift - Swift MessageKit 问题
- python - Pycharm 不会将我的函数返回到控制台
- javascript - 尝试使用一些 trig 和 JavaScript 画布重新创建大逃杀红区功能
- entity-framework - ASP.NET core 2.1 数据库迁移
- excel - 如何找到等于给定值的对应元素的最小数字总和?
- reactjs - 将 gql 函数转换为插入变量的字符串
- vue.js - Vuex如何跟踪索引并将其传递给组件?
- vue.js - 带有 Vuex 的 vue-table-2 - 无法更改计数属性