2013-06-25 77 views
1

我正在編寫JUL日誌記錄Handler,我想用當前請求的信息來擴充記錄的消息,如果我們當前正在處理請求。爲了做到這一點,我已經將Provider<Thing>注入Handler,其中Thing@RequestScoped有沒有辦法檢查我是否在與Guice的servlet請求中?

但是,如果在我們沒有處理請求時發生日誌記錄,則調用provider.get()將拋出OutOfScopeException。我覺得像趕上OutOfScopeException將是不好的形式。有沒有更好的方法來確定請求是否正在執行?

回答

1

隨着檢票口我用了一個小技巧。這應該是框架獨立的。我做了一個請求過濾器,並在其中放置了一個公共靜態的ThreadLocal。所以如果當前線程是從請求中產生的,threadlocal將被設置。

public class SessionContext implements Filter { 

    private static final ThreadLocal<HttpSession> session = new ThreadLocal<HttpSession>(); 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
     return; 
    } 

    @Override 
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
     session.set(((HttpServletRequest)servletRequest).getSession()); 
     filterChain.doFilter(servletRequest, servletResponse); 
    } 

    @Override 
    public void destroy() { 
     return; 
    } 

    public static HttpSession getSession(){ 
     return session.get(); 
    } 

    public static User getUser(){ 
     return (User) session.get().getAttribute(UserService.USER); 
    } 
} 

,並在web.xml:

<filter> 
    <filter-name>session</filter-name> 
    <filter-class>SessionContext</filter-class> 
</filter> 
+0

這是個好主意!實際上,你甚至不用慌亂web.xml,你可以使用'filter(「/ *」)。(MyFilter.class)'語法:https://code.google.com/p/谷歌 - 吉斯/維基/的servlet#Filter_Mapping –

0

據我所知,沒有優雅的方式來做到這一點。 Guice API很嚴格,不會授予進行此類測試所需的線程本地訪問權限。從版本3開始,本地線程位於com.google.inject.servlet.GuiceFilter#localContext。你可以通過反射來訪問它,但它可能比捕捉異常更糟。

我會堅持緩存異常...或入侵該類並添加靜態布爾測試方法。

+0

是啊,我看着在GuiceFilter和ServletScopes代碼,並想我能不能用它們來檢查。沒有內置的Guice方法來檢查調用者是否在範圍內?如果不是,我想我只會自己創建ThreadLocal。 –

相關問題