Spring WebFlux 的会话和请求范围
Session and request scopes with Spring WebFlux
目前正在使用 Spring Boot 2.0.0.M4、Spring 5.0.0.RC4[=28 进行响应式编程实验=] 和 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$dce0361.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 注入?
如果没有,这是计划好的吗?
感谢您的宝贵时间。
事实上,线程局部变量不能在 Spring WebFlux 应用程序中使用,因为工作单元可以随时发生在任何线程上,并且您不能指望在一个线程上处理请求单线程。
这种类型的功能可以使用新的 Reactor Context 来实现,它允许您将一些数据附加到反应管道。正如您所注意到的,Spring WebFlux 目前不支持此功能。
目前正在使用 Spring Boot 2.0.0.M4、Spring 5.0.0.RC4[=28 进行响应式编程实验=] 和 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$dce0361.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 注入?
如果没有,这是计划好的吗?
感谢您的宝贵时间。
事实上,线程局部变量不能在 Spring WebFlux 应用程序中使用,因为工作单元可以随时发生在任何线程上,并且您不能指望在一个线程上处理请求单线程。
这种类型的功能可以使用新的 Reactor Context 来实现,它允许您将一些数据附加到反应管道。正如您所注意到的,Spring WebFlux 目前不支持此功能。