2015-04-01 52 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