我正在编写JUL日志Handler
,如果我们当前正在处理请求,我想用当前请求的信息来扩充记录的消息。为实现此目的,我在Provider<Thing>
中注入Handler
,其中Thing
为@RequestScoped
。
但是,如果在我们不处理请求时发生日志记录,则调用provider.get()
会抛出OutOfScopeException
。我觉得抓住OutOfScopeException
会很糟糕。有没有更好的方法来确定请求当前是否正在执行?
答案 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
。你可以通过反思来访问它,但它可能比捕获异常更糟糕。
我会坚持缓存异常...或者入侵该类并添加一个静态布尔测试方法。