HttpServletRequest をコンポーネントから呼び出す方法

HttpServletRequest を引数に与えられていないコンポーネントの内部でHttpServletRequest を呼び出す方法です。
以下のようなThreadLocalを利用したクラスを用意します。

public class HttpServletRequestLocator {

  private static ThreadLocal<HttpServletRequest> httpServletRequests =
    new ThreadLocal<HttpServletRequest>();

  public static HttpServletRequest get() {
    return httpServletRequests.get();
  }

  public static void set(HttpServletRequest httpServletRequest) {
    httpServletRequests.set(httpServletRequest);
  }

  private HttpServletRequestLocator() {
  }
}

ServletFilter は以下のようにします。

  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest prevHttpServletRequest = HttpServletRequestLocator.get();
    try {
      HttpServletRequestLocator.set((HttpServletRequest) request);
      filterChain.doFilter(request, response);
    } finally {
      HttpServletRequestLocator.set(prevHttpServletRequest);
    }
  }

これでこのフィルターが通ったコンポーネントでは、いつでもHttpServletRequestを呼び出せるようになります。

    HttpServletRequest httpServletRequest = HttpServletRequestLocator.get();