前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring 5 webflux异常处理

spring 5 webflux异常处理

作者头像
code4it
发布2018-09-17 15:51:48
1.3K0
发布2018-09-17 15:51:48
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下spring 5 webflux的异常处理

maven

代码语言:javascript
复制
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

ExceptionHandler

由于webflux也支持传统spring mvc的大部分注解,因此原来的ExceptionHandler也是支持的。

代码语言:javascript
复制
@RestControllerAdvice
public 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();
    }
}

启动的时候可以看到日志

代码语言:javascript
复制
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 hierarchy
2018-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

代码语言:javascript
复制
/**
 * Package-private class to assist {@link RequestMappingHandlerAdapter} with
 * resolving, initializing, and caching annotated methods declared in
 * {@code @Controller} and {@code @ControllerAdvice} components:
 * <ul>
 * <li>{@code @InitBinder}
 * <li>{@code @ModelAttribute}
 * <li>{@code @RequestMapping}
 * <li>{@code @ExceptionHandler}
 * </ul>
 *
 * @author Rossen Stoyanchev
 * @since 5.0
 */
class ControllerMethodResolver {

    private static Log logger = LogFactory.getLog(ControllerMethodResolver.class);

    private final List<SyncHandlerMethodArgumentResolver> initBinderResolvers;

    private final List<HandlerMethodArgumentResolver> modelAttributeResolvers;

    private final List<HandlerMethodArgumentResolver> requestMappingResolvers;

    private final List<HandlerMethodArgumentResolver> exceptionHandlerResolvers;

    private final ReactiveAdapterRegistry reactiveAdapterRegistry;
    //......
}

可以看到支持InitBinder,ModelAttribute,RequestMapping,ExceptionHandler这几个注解。

实例

代码语言:javascript
复制
    @GetMapping(value = "/error",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Mono<String> exceptionReturn(){
//        throw new RuntimeException("hello");
        return Mono.error(new RuntimeException("test error"));
    }

与传统mvc不同的是,除了直接throw异常外,Mono或Flux可以直接error一个异常,在exceptionHandlers都可以被接收处理

小结

webflux支持mvc的注解,是一个非常便利的功能,相比较于RouteFunction,自动扫描注册比较省事。异常处理可以沿用ExceptionHandler。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-02-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • maven
  • ExceptionHandler
  • 实例
  • 小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档