2011-08-26 20 views
21

मैं जर्सी guice और guice के साथ tomcat 6, जर्सी 1.8 का उपयोग कर रहा हूँ 3. मुझे अपने सेटअप के साथ जेएसपी का उपयोग कर समस्या हो रही है। मेरे पास "स्टेटस" सर्वलेट वेब.एक्सएमएल द्वारा कॉन्फ़िगर किया गया एक सरल सर्वलेट के रूप में कार्य करता है, जो गिइसफिल्टर द्वारा कॉन्फ़िगर किया गया एक जर्सी सर्वलेट है जो परिणाम प्रस्तुत करने के लिए एक जेएसपी व्यू प्रतिक्रिया (jsp is /diff/index.jsp) देता है:जर्सी गुइस जेएसपी कैसे करें?

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

यह सब सरल जर्सी के साथ पूरी तरह से काम करता है, एक बार मैं Guice एकीकरण के साथ यह है करने के लिए कोशिश कर रहा हूँ JSP विफल रहता है और मैं "के साथ अनुरोध किया गया संसाधन (/diff/index.jsp) 404 प्रतिक्रिया हो रही है नहीं है उपलब्ध।"

डिबगर का उपयोग करना मैं देख सकता हूँ कि JSPTemplateProcessor के रूप में बुलाया है और एक StandardWrapper है कि "isJspServlet = true" और "jspFile = अशक्त" के साथ एक 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 servlet जोड़ना बहुत अच्छा नहीं था।

Btw, मैं the jersey mailing list पर जुला 25, 2010 से धागा पढ़ा है, लेकिन यह मेरे लिए काम नहीं किया।

सहायता की सराहना की धन्यवाद, Eishay

- परिशिष्ट - मैं अपने आप को व्यापार तर्क कोड से JSP बुला पाते हैं। बदसूरत लेकिन काम करता है:

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 कॉल के रूप में अनुरोध को रोकता है डिफ़ॉल्ट हैंडलर।

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> 

नोट यह एक filter विन्यास के रूप में एक servlet विन्यास करने का विरोध किया है:

समाधान "के माध्यम से" के बजाय एक फ़िल्टर 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 विकल्प के ऊपर उपयोग पर ध्यान दें।

आप अभी भी मूल प्रश्न में सूचीबद्ध अन्य विकल्पों का उपयोग कर सकते हैं।

अगले कदम के लिए, आप भी refer to this question विशेष रूप से एक समस्या को शामिल कर सकते हैं मैं Guice निर्भरता इंजेक्शन के साथ काम करने के लिए इस विन्यास में Guice AOP जोड़ने, जर्सी बाकी सेवाएं, स्टेटिक सामग्री (जावास्क्रिप्ट, सीएसएस, छवियाँ) तथा लौटने JSP Viewables के साथ किया था ।

संबंधित मुद्दे