如何在Spring中检查Request Scope的可用性?


问题内容

我正在尝试设置一些代码,如果spring的请求范围可用,则将以一种方式运行,而如果上述范围不可用,则将以另一种方式运行。

有问题的应用程序是一个Web应用程序,但是有一些JMX触发器和计划任务(即Quartz)也可以触发调用。

例如

/**
 * This class is a spring-managed singleton
 */
@Named
class MySingletonBean{

    /**
     * This bean is always request scoped
     */
    @Inject
    private MyRequestScopedBean myRequestScopedBean;

    /* can be invoked either as part of request handling
       or as part of a JMX trigger or scheduled task */
    public void someMethod(){
        if(/* check to see if request scope is available */){
            myRequestScopedBean.invoke();
        }else{
            //do something else
        }
    }
}

假设myRequestScopedBean请求范围内。

我知道这可以通过try- catch调用来完成myRequestScopedBean,例如:

/**
 * This class is a spring-managed singleton
 */
@Named
class MySingletonBean{

    /**
     * This bean is always request scoped
     */
    @Inject
    private MyRequestScopedBean myRequestScopedBean;

    /* can be invoked either as part of request handling
       or as part of a JMX trigger or scheduled task */
    public void someMethod(){
        try{
            myRequestScopedBean.invoke();
        }catch(Exception e){
            //do something else
        }
    }
}

但这似乎很笨拙,所以我想知道是否有人知道一种优雅的Spring方式来询问某些东西,以查看是否存在请求范围的bean。

非常感谢!


问题答案:

您可以使用此处描述的if检查

if (RequestContextHolder.getRequestAttributes() != null) 
    // request thread

而不是捕获异常。有时,这似乎是最简单的解决方案。