我想将我的请求范围 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
bean:
@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: No thread-bound request found: 你指的是实际 Web 请求之外的请求属性,或在原始接收线程之外处理请求?如果您实际上是在 Web 请求中操作并且仍然收到此消息,则您的代码可能在 DispatcherServlet/DispatcherPortlet 之外运行:在这种情况下,请使用 RequestContextListener 或 RequestContextFilter 来公开当前请求。
可以通过注释UICtx
或JPage
as来解决此问题@Scope(value = "[..]", proxyMode = ScopedProxyMode.TARGET_CLASS)
。
它仅在JPage
作为控制器字段注入时才有效。JPage
当作为方法参数注入时它不起作用。
我该如何注入请求范围的bean?