有没有办法检查我是否在使用Guice的servlet请求中?

时间:2013-06-25 16:52:20

标签: java servlets guice guice-servlet

我正在编写JUL日志Handler,如果我们当前正在处理请求,我想用当前请求的信息来扩充记录的消息。为实现此目的,我在Provider<Thing>中注入Handler,其中Thing@RequestScoped

但是,如果在我们不处理请求时发生日志记录,则调用provider.get()会抛出OutOfScopeException。我觉得抓住OutOfScopeException会很糟糕。有没有更好的方法来确定请求当前是否正在执行?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

据我所知,没有优雅的方法可以做到这一点。 Guice API很紧凑,不会授予访问进行此类测试所需的本地线程的权限。从版本3开始,有问题的线程位于com.google.inject.servlet.GuiceFilter#localContext。你可以通过反思来访问它,但它可能比捕获异常更糟糕。

我会坚持缓存异常...或者入侵该类并添加一个静态布尔测试方法。