如何注入请求范围的bean?

时间:2017-04-17 02:49:27

标签: spring-mvc spring-boot

我想将请求范围的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公开当前   请求。

可以通过将UICtxJPage注释为@Scope(value = "[..]", proxyMode = ScopedProxyMode.TARGET_CLASS)来解决此问题。它仅在jpage作为控制器字段注入时有效。将jpage作为方法参数注入时,它不起作用。

我怎么想注入一个请求范围的bean?

0 个答案:

没有答案