Spring WebFlux的会话和请求范围

时间:2017-10-03 09:07:30

标签: spring-webflux

目前使用 Spring Boot 2.0.0.M4 Spring 5.0.0.RC4 Reactor 3.1.0.RC1 试验反应式编程

在运行时将@RequestScope或@SessionScope bean注入WebFlux REST控制器失败:

java.lang.IllegalStateException: No Scope registered for scope name 'request'
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:342) ~[spring-beans-5.0.0.RC4.jar:5.0.0.RC4]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-5.0.0.RC4.jar:5.0.0.RC4]
    at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) ~[spring-aop-5.0.0.RC4.jar:5.0.0.RC4]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) ~[spring-aop-5.0.0.RC4.jar:5.0.0.RC4]
    at com.adeliosys.scope.Counter$$EnhancerBySpringCGLIB$$7dce0361.increment(<generated>) ~[classes/:na]
    at com.adeliosys.scope.Controller.getQuote(Controller.java:25) ~[classes/:na] // line with theScopedBean.doSometing() call in the REST controller
    (...)

使用Spring Web MVC的阻塞等效工作正常。

我理解反应性编程与线程本地化混淆,但是WebFlux支持的请求或会话范围bean注入

如果没有,这是否计划好了?

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

实际上,线程本地不能在Spring WebFlux应用程序中使用,因为工作单元可以随时在任何线程上发生,并且您不能指望在单个线程上处理请求。

可以使用新的Reactor Context实现这种类型的功能,它允许您将一些数据附加到反应式管道。正如您所注意到的,Spring WebFlux目前不支持此功能。