web-dev-qa-db-ja.com

JAX-RSリソースでServletContextを取得します

TomcatにデプロイするJAX-RSで遊んでいます。基本的には:

@Path("/hello")
@Produces({"text/plain"})
public class Hellohandler {

    @GET
    public String hello() {
        return "Hello World";
    }

}

JAX-RSリソース内でServletContextを取得する方法はありますか?

64
leeeroy

さらに、@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
96
Adeel Ansari

他の人が指摘したように、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アノテーションを使用します。

8
JohnC

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回読み取り、割り当てた静的変数で何度も再利用できます。

6
Kobby Kan

このようなリソースインジェクションを使用するだけで、

@Resource ServletContext servletContext;
5
ZZ Coder
0
idbill