TomcatにデプロイするJAX-RSで遊んでいます。基本的には:
@Path("/hello")
@Produces({"text/plain"})
public class Hellohandler {
@GET
public String hello() {
return "Hello World";
}
}
JAX-RSリソース内でServletContext
を取得する方法はありますか?
さらに、@Resource
注釈が機能しない場合があります。これを試して
@javax.ws.rs.core.Context
ServletContext context;
サービスメソッドに到達するまで注入は行われません
public class MyService {
@Context ServletContext context;
public MyService() {
print("Constructor " + context); // null here
}
@GET
@Path("/thing") {
print("in wizard service " + context); // available here
他の人が指摘したように、servletContextはフィールドレベルで注入できます。メソッドレベルで注入することもできます。
public static class MyService {
private ServletContext context;
private int minFoo;
public MyService() {
System.out.println("Constructor " + context); // null here
}
@Context
public void setServletContext(ServletContext context) {
System.out.println("servlet context set here");
this.context = context;
minFoo = Integer.parseInt(servletContext.getInitParameter("minFoo")).intValue();
}
@GET
@Path("/thing")
public void foo() {
System.out.println("in wizard service " + context); // available here
System.out.println("minFoo " + minFoo);
}
}
これにより、使用可能なservletContextで追加の初期化を実行できます。
明らかな注意-メソッド名を使用する必要はありません setServletContext。標準のJavaセッターのBean命名パターンに従う限り、任意のメソッド名を使用できます。 void setXXX(Foo foo) @Contextアノテーションを使用します。
ServletContextListenerを実装すると、サーブレットコンテキストも利用できます。これにより、起動時に接続文字列などのパラメータを簡単にロードできます。 Webアプリケーションの起動時にServletContextListenerをロードするweb.xmlでリスナークラスを定義できます。
Web.xmlファイル内に、<listener>
and <context-param>
タグ。 <listener>
は、起動時に呼び出されるクラスを指定します。 <context-param>
タグは、Webアプリケーション内で使用可能なコンテキストパラメータを定義します。
まず、<listener>
and <context-param>
web.xmlファイルのタグ:
<web-app>
<!-- ... -->
<listener>
<listener-class>com.your.package.ServletContextClass</listener-class>
</listener>
<!-- Init parameters for db connection -->
<context-param>
<param-name>your_param</param-name>
<param-value>your_param_value</param-value>
</context-param>
<!-- ... -->
</web-app>
次に、サーブレットコンテキストクラスを次のように作成します。
public class ServletContextClass implements ServletContextListener
{
public void contextInitialized(ServletContextEvent arg0)
{
//use the ServletContextEvent argument to access the
//parameter from the context-param
String my_param = arg0.getServletContext().getInitParameter("your_param");
}//end contextInitialized method
@Override
public void contextDestroyed(ServletContextEvent arg0)
{ }//end constextDestroyed method
}
読み込んだパラメータを割り当てる静的変数を選択できるようになりました。これにより、起動時にパラメーターを1回読み取り、割り当てた静的変数で何度も再利用できます。
このようなリソースインジェクションを使用するだけで、
@Resource ServletContext servletContext;