2

我正在编写 JUL 日志记录Handler,如果我们当前正在处理请求,我想用有关当前请求的信息来扩充记录的消息。为此,我将 aProvider<Thing>注入到Handler, where Thingis 中@RequestScoped

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

4

2 回答 2

2

对于检票口,我使用了一个小技巧。这应该是独立于框架的。我做了一个请求过滤器并在其中放置了一个公共静态 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>
于 2013-07-01T18:18:24.953 回答
0

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

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

于 2013-06-27T20:17:27.980 回答