使用Spring WebFlux进行会话和请求范围

16

目前正在使用Spring Boot 2.0.0.M4Spring 5.0.0.RC4Reactor 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个回答

14

确实,在Spring WebFlux应用程序中无法使用线程本地变量,因为工作单元可以在任何时间的任何线程上发生,您不能期望一个请求在单个线程上处理。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接