2013-06-25 1 views
1

Я пишу JUL logging Handler, и я хотел бы увеличить зарегистрированные сообщения с информацией о текущем запросе, если мы сейчас обрабатываем запрос. Для этого я ввел Provider<Thing> в Handler, где Thing - @RequestScoped.Есть ли способ проверить, не попал ли я в запрос сервлета с Guice?

Однако при вызове 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/ Google-Guice/вики/ServletModule # Filter_Mapping –

0

Насколько я знаю, нет элегантного способа сделать это. API Guice является жестким и не будет предоставлять доступ к локальному потоку, который необходим для проведения такого теста. Начиная с версии 3, вопрос, связанный с потоком, находится на com.google.inject.servlet.GuiceFilter#localContext. Вы можете получить доступ к нему путем отражения, но это, возможно, еще хуже, чем уловка исключения.

Я хотел бы использовать кеширование исключения ... или взломать этот класс и добавить статический логический метод тестирования.

+0

Да, я посмотрел на код в GuiceFilter и ServletScopes и полагал, что я не мог использовать их для проверки. Нет встроенного метода Guice, чтобы проверить, находится ли вызывающий объект внутри области? Если я не думаю, что я просто создам свой собственный ThreadLocal. –