@Context アノテーションで自作コンポーネントを DI 可能にするための方法です。
JAX-RS に準拠した Web アプリケーションで, HttpServletRequest や HttpServletResponse オブジェクトを使用したいときは, @Context アノテーションを使って以下のようにするのが一般的です。
@Context
private HttpServletRequest httpServletRequest;
こうすることで,実行時には httpServletRequest にオブジェクトが格納された状態で使用可能になります。
こういった使い方ができるのは他に以下のようなものがあります。
- javax.ws.rs.container.ContainerRequestContext
- javax.ws.rs.container.ResourceContext
- javax.ws.rs.core.Application
- javax.ws.rs.core.HttpHeaders
- javax.ws.rs.core.Request
- javax.ws.rs.core.SecurityContext
- javax.ws.rs.core.UriInfo
- javax.ws.rs.core.Configuration
- javax.ws.rs.ext.Providers
- javax.servlet.HttpServletRequest
- javax.servlet.HttpServletResponse
- javax.servlet.ServletConfig
- javax.servlet.ServletContext
では,これを自作するにはどうしたらいいのでしょうか。JAX-RS の実装に RESTEasy を使っているのなら,以下の方法で簡単にできます。
(1)
MyClass myObject = createMyObject();
Map<Class<?>, Object> contextDataMap = ResteasyProviderFactory.getContextDataMap();
contextDataMap.put(MyClass.class, myObject);
使うときは,次の通りです。
(2)
@Context
private MyClass myObject;
例えば, (1) をフィルターで行い, (2) をコントローラーで利用するといった使い方ができますね。