2011-08-26 6 views
21

私はtomcat 6、ジャージー1.8、ジャージーguiceとguice 3を使用しています。 セットアップでJSPを使用する際に問題があります。 jspビュー応答(jspは/diff/index.jsp)を返すGuiceFilterによって構成されたjerseyサーブレットweb.xmlによって構成された単純なサーブレットとして「Status」サーブレットが提供されています。ジャージーGuice JSPにする方法?

Viewable view = new Viewable("/diff/index.jsp", null); 
Response response = Response.ok().entity(view).build(); 
return response; 

私は単純にジャージーで完璧に動作しますが、Guiceとの統合に失敗するとJSPが失敗し、「要求されたリソース(/diff/index.jsp)はありません。利用可能です。

デバッガを使用すると、JSPTemplateProcessorが呼び出され、「isJspServlet = true」および「jspFile = null」を持つStandardWrapperでRequestDispatcherが取得されていることがわかります。

のweb.xmlは次のようになります。

<servlet> 
     <display-name>Status Page</display-name> 
     <servlet-name>Status</servlet-name> 
     <servlet-class>my.BaseStatusPage</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Status</servlet-name> 
     <url-pattern>/Status/*</url-pattern> 
    </servlet-mapping> 

    <filter> 
     <filter-name>guiceFilter</filter-name> 
     <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>guiceFilter</filter-name> 
     <url-pattern>/REST/*</url-pattern> 
    </filter-mapping> 
    <listener> 
     <listener-class>my.GuiceServletConfig</listener-class> 
    </listener> 

=====================

GuiceServletConfig:

public class GuiceServletConfig extends GuiceServletContextListener { 

    @Override 
    protected Injector getInjector() { 
    return Guice.createInjector(new JerseyServletModule() { 

     @Override 
     protected void configureServlets() { 
     bind(DiffPage.class);// the jersey servlet 

     Map<String, String> params = new HashMap<String, String>(); 
     params.put(PROPERTY_PACKAGES, "my"); 
     params.put(PROPERTY_WEB_PAGE_CONTENT_REGEX, ".*\\.jsp"); 
     params.put(FEATURE_REDIRECT, "true"); 
     params.put(FEATURE_IMPLICIT_VIEWABLES, "true"); 
     params.put(RESOURCE_CONFIG_CLASS, "com.sun.jersey.api.core.PackagesResourceConfig"); 

     serve("/REST/*").with(GuiceContainer.class, params); 
     } 
    }); 
    } 

GuiceContainerをフィルタとして使用すると、web.xmlからサービスされるサーブレットが失敗します。 web.xmlにjspサーブレットを追加してもあまり効果がありませんでした。

Btw、私はこのスレッドを2010年7月25日からthe jersey mailing listから読んだが、うまくいかなかった。付録 - - 私は自分自身がビジネスロジックコードからJSPを呼び出す見つける

ヘルプは、Eishay

を 感謝を感謝しています。醜いが、作品:

protected Response renderJsp(HttpServletRequest request, 
     HttpServletResponse response, ServletConfig servletConfig) { 
    request.setAttribute("org.apache.catalina.jsp_file", "/diff/index.jsp"); 
    Class jspServletClazz; 
    try { 
     jspServletClazz = forName("org.apache.jasper.servlet.JspServlet"); 
     Object jspServlet = jspServletClazz.getConstructor().newInstance(); 
     jspServletClazz.getMethod("init", ServletConfig.class).invoke(jspServlet, 
      servletConfig); 
     jspServletClazz.getMethod("service", HttpServletRequest.class, 
      HttpServletResponse.class).invoke(jspServlet, request, response); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
    return Response.ok().build(); 
    } 
+1

こんにちは、この問題の運は何ですか? –

+0

いいえ、私はコードからJSPを呼び出すのが醜いですが、動作します。 "回答"として追加されます –

+0

私はJSPを捨ててしまい、Freemarkerと一緒に行きました。 –

答えて

4

問題は、サーブレット「と」要求「を果たす」ためにGuiceのを設定することです:サーブレット・ブロック要求チェーンなどに以降渡されてから、静的コンテンツおよびJSPの呼び出しなどの要求を防ぎますデフォルトのハンドラ。これはservlet構成とは対照的にfilter構成である

のweb.xml

<listener> 
    <listener-class>my.guice.config.package.GuiceServletConfig</listener-class> 
</listener> 

<filter> 
    <filter-name>guiceFilter</filter-name> 
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>guiceFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

溶液代わりにフィルタ「を介して」Guiceのに「フィルタ」要求を設定することです。

GuiceServletConfig

public class GuiceServletConfig extends GuiceServletContextListener { 

    @Override 
    protected Injector getInjector() { 
     return Guice.createInjector(new JerseyServletModule() { 

      @Override 
      protected void configureServlets() { 

       /* Bindings */ 
       bind(JerseyResource.class); 

       /* Parameters*/ 
       Map<String, String> params = new HashMap<String, String>(); 
       params.put(JSP_TEMPLATES_BASE_PATH, "/WEB-INF/jsp"); 
       params.put(FEATURE_FILTER_FORWARD_ON_404, "true"); 

       filter("/*").through(GuiceContainer.class, params); 
      } 
     }); 
    } 
} 

filter().through();代わりにserve().with();を使用します。

これにより、静的およびJSPリクエスト(および!を含む)をフィルタチェーン内の次のリンクに渡し、最終的にはデフォルトのコンテンツハンドラに渡すことができます。

さらに複雑なServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEXオプションの代わりに、最新のServletContainer.FEATURE_FILTER_FORWARD_ON_404オプションの上記の使用方法に注意してください。静的コンテンツの既定の場所がわかっている場合は、

元の質問に記載されている他のオプションは引き続き使用できます。

Guice Dependency Injection、Jersey REST Services、静的コンテンツ(JavaScript、CSS、Images)とJSP Viewablesを返すように、この設定にGuice AOPを追加する際の問題点を具体的に挙げることもできます(refer to this question)。 。

関連する問題