1

我想将我的请求范围 bean 注入我的另一个 bean。

@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST)
public class UiCtx {

    @Autowired(required = true)
    private ApplicationContext ctx;

    @Autowired(required = true)
    private ServletWebRequest req;

    // [...]
}

我尝试将这个bean注入一个JPagebean:

@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 来公开当前请求。

可以通过注释UICtxJPageas来解决此问题@Scope(value = "[..]", proxyMode = ScopedProxyMode.TARGET_CLASS)

它仅在JPage作为控制器字段注入时才有效。JPage当作为方法参数注入时它不起作用。

我该如何注入请求范围的bean?

4

1 回答 1

0

遵循错误消息中给出的建议(我以粗体强调):

BeanCreationException:创建名为 'uiCtx' 的 bean 时出错:范围 'request' 对于当前线程无效;如果您打算从单例中引用它,请考虑为该 bean定义一个作用域代理;

您需要使用注入proxyMode的依赖项来启动应用程序,例如定义UICtx

@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UiCtx {
   // omitted class body
}

或速记@RequestScope。请参阅Baeldung 教程汤姆评论中链接的副本:

将请求范围的 bean 注入另一个 bean

于 2022-01-05T20:27:07.483 回答