序
本文主要研究一下spring 5 webflux的异常处理
maven
复制代码 org.springframework.boot spring-boot-starter-webflux
ExceptionHandler
由于webflux也支持传统spring mvc的大部分注解,因此原来的ExceptionHandler也是支持的。
@RestControllerAdvicepublic class ExceptionHandlers { private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionHandlers.class); @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public String serverExceptionHandler(Exception ex) { LOGGER.error(ex.getMessage(),ex); return ex.getMessage(); }}复制代码
启动的时候可以看到日志
2018-02-12 19:26:03.249 INFO 7053 --- [ main] o.s.w.r.r.m.a.ControllerMethodResolver : Looking for @ControllerAdvice: org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext@65d09a04: startup date [Mon Feb 12 19:25:59 CST 2018]; root of context hierarchy2018-02-12 19:26:03.281 INFO 7053 --- [ main] o.s.w.r.r.m.a.ControllerMethodResolver : Detected @ExceptionHandler methods in exceptionHandlers复制代码
spring-webflux-5.0.2.RELEASE-sources.jar!/org/springframework/web/reactive/result/method/annotation/ControllerMethodResolver.java
/** * Package-private class to assist {@link RequestMappingHandlerAdapter} with * resolving, initializing, and caching annotated methods declared in * {@code @Controller} and {@code @ControllerAdvice} components: *
- *
- {@code @InitBinder} *
- {@code @ModelAttribute} *
- {@code @RequestMapping} *
- {@code @ExceptionHandler} *
可以看到支持InitBinder,ModelAttribute,RequestMapping,ExceptionHandler这几个注解。
实例
@GetMapping(value = "/error",produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public MonoexceptionReturn(){// throw new RuntimeException("hello"); return Mono.error(new RuntimeException("test error")); }复制代码
与传统mvc不同的是,除了直接throw异常外,Mono或Flux可以直接error一个异常,在exceptionHandlers都可以被接收处理
小结
webflux支持mvc的注解,是一个非常便利的功能,相比较于RouteFunction,自动扫描注册比较省事。异常处理可以沿用ExceptionHandler。