阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程
问题解答
你遇到的问题是,Spring Boot全局异常处理器返回400,但是被WebFlux客户端调用时Filter仍返回500。
原因
这是因为WebFlux客户端使用的是Reactive编程模型,而Spring Boot的全局异常处理器是基于Servlet的。WebFlux客户端不会触发Servlet的Filter链,因此全局异常处理器无法生效。
解决方案
- 使用WebFlux的异常处理机制
可以在WebFlux的配置文件中添加异常处理机制,例如:
@Configuration
public class WebFluxConfig {
@Bean
public RouterFunction<ServerResponse> routerFunction() {
return RouterFunctions.route(RequestPredicates.all(), this::handle);
}
private Mono<ServerResponse> handle(ServerRequest request) {
// 处理异常
return request.onStatus(status -> {
if (status.is4xxClientError()) {
return ServerResponse.badRequest().build();
}
return ServerResponse.serverError().build();
});
}
}
- 使用Spring Boot的全局异常处理器
可以在Spring Boot的配置文件中添加全局异常处理器,例如:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
resolvers.add(new MyExceptionHandler());
}
}
public class MyExceptionHandler extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
filterChain.doFilter(request, response);
} catch (Exception e) {
// 处理异常
response.setStatus(HttpStatus.BAD_REQUEST.value());
response.getWriter().write("Bad Request");
}
}
}
注意
在使用WebFlux时,需要将全局异常处理器配置在WebFlux的配置文件中,而不是Spring Boot的配置文件中。