我想将请求范围的bean注入我的其他bean。
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST)
public class UiCtx {
@Autowired(required = true)
private ApplicationContext ctx;
@Autowired(required = true)
private ServletWebRequest req;
[...]
}
我尝试将此bean注入jpage禁令。
@Component
@Scope("prototype")
public class Jpage extends AbstractUiComponent {
[...]
}
public abstract class AbstractUiComponent {
@Autowired(required = true)
private UiCtx ctx;
[...]
}
在控制器中我试过了:
@RestController class GreetingController {
@RequestMapping("/jpage")
void jpage(HttpServletRequest request, HttpServletResponse response,
@Autowired @Qualifier("jpage") AbstractUiComponent jpage) throws IOException {
WritePage.writeWebPage(request, response, jpage);
}
}
我得到了:
无法实例化[pl.mirage.components.AbstractUiComponent]:是 它是一个抽象类?嵌套异常是 java.lang.InstantiationException
另一种尝试。它不起作用,因为@RestController是一个单例 - 你不能将请求范围注入单例范围:
@RestController
class GreetingController {
@Autowired
@Qualifier("jpage")
AbstractUiComponent jpage;
@RequestMapping("/jpage")
void jpage(HttpServletRequest request, HttpServletResponse response) throws IOException {
WritePage.writeWebPage(request, response, jpage);
}
我得到了:
org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为'greetingController'的bean时出错:不满意 通过字段'jpage'表示的依赖;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为“jpage”的bean时出错:不满意的依赖项 通过字段'ctx'表示;嵌套异常是 org.springframework.beans.factory.BeanCreationException:错误 创建名为'uiCtx'的bean:范围'请求'不活动 当前线程;考虑为您定义此bean的作用域代理 打算从单身人士那里引用它;嵌套异常是 java.lang.IllegalStateException:找不到线程绑定请求:是 您指的是实际Web请求之外的请求属性, 或处理原始接收线程之外的请求?如果 您实际上是在Web请求中运行并仍然收到此信息 消息,你的代码可能在外面运行 DispatcherServlet / DispatcherPortlet:在这种情况下,请使用 RequestContextListener或RequestContextFilter公开当前 请求。
可以通过将UICtx
或JPage
注释为@Scope(value = "[..]", proxyMode = ScopedProxyMode.TARGET_CLASS)
来解决此问题。它仅在jpage作为控制器字段注入时有效。将jpage
作为方法参数注入时,它不起作用。
我怎么想注入一个请求范围的bean?