2015-04-01 70 views
4

我试图设置一些代码,如果弹簧的请求范围可用,将采用其中一种方式,如果所述范围不可用,则采用另一种方式。如何检查Spring中的请求范围可用性?

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

E.g.

/** 
* 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 
     } 
    } 
} 

,但似乎真的笨重,所以我不知道是否有人优雅的春季办法知道询问一些东西,看看请求范围的bean是否可用。

非常感谢!

+0

为什么你需要检查bean是否被请求作用域?这似乎很倒退。 – 2015-04-01 00:33:23

+0

对不起,也许这个不清楚。这个bean总是被请求作用域,但'someMethod'的调用可能不是请求处理的一部分 – Taylor 2015-04-01 00:34:27

+0

我仍然感到困惑。 'MyRequestScopedBean'是请求范围的。 'MySingletonBean'是单独作用域的。你需要检查什么?为什么? – 2015-04-01 00:36:46

回答

5

您可以使用,如果在这里描述的检查

SPRING - Get current scope

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

,而不是捕捉异常的。 有时候看起来像最简单的解决方案。

1

您可以注入Provider<MyRequestScopedBean>,并在调用get方法时发现异常,但应重新考虑设计。如果你感到强烈的它,你可能应该有两个豆不同预选赛

编辑

退一步讲,如果你正在使用Java配置,@Scope("prototype")@Bean方法,让你决定在那里,你可以得到一个手柄如果可用,请通过RequestContextHolder索取。但我强烈建议你重新考虑你的设计

+1

感谢您的回答。如果我理解正确,那么您建议将尝试捕获包装在提供程序中?我试图找出是否有一些方法来查询这是否可行,而不是尝试和失败。但请欣赏答案。 – Taylor 2015-04-01 00:43:41