2011-08-26 22 views
21

Estoy usando tomcat 6, jersey 1.8 con jersey guice y guice 3. Tengo problemas al usar JSP con mi configuración. Tengo un servlet de "estado" servido como un servlet simple configurado por web.xml, un servlet de jersey configurado por GuiceFilter que devuelve una respuesta de vista jsp (jsp es /diff/index.jsp) para mostrar el resultado como en:Jersey Guice JSP cómo hacerlo?

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

Todo funciona perfectamente con Jersey simple, una vez que estoy tratando de tenerlo con la integración de Guice, el JSP falla y obtengo una respuesta 404 con "El recurso solicitado (/diff/index.jsp) no es disponible."

Usando el depurador puedo ver que JSPTemplateProcessor como se llama y obtuve un RequestDispatcher con un StandardWrapper que tiene "isJspServlet = true" y "jspFile = null".

El web.xml se parece a esto:

<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); 
     } 
    }); 
    } 

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

Tener GuiceContainer como un filtro hecho los servlets servidos desde el web.xml fallar. Agregar un servlet jsp en web.xml no fue muy útil.

Por cierto, he leído el hilo desde el 25 de julio de 2010 en the jersey mailing list pero no funcionó para mí.

ayuda apreció Gracias, Eishay

- Apéndice - me encuentro llamar a JSP desde el código de lógica de negocio. Feo, pero funciona:

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

Hola amigo, ¿hay algo de suerte con este problema? Parece que estoy obteniendo lo mismo –

+0

No, me encuentro llamando a JSP desde el código, feo pero funciona. Se agregará como una "respuesta" –

+0

Terminé abandonando JSP y fui con Freemarker. –

Respuesta

4

El problema se debe a la configuración de Guice para "servir" peticiones "con" un Servlet: Los bloques de servlets la cadena de petición y evita que las peticiones como contenido estático y llamadas JSP se transmita en adelante a los controladores predeterminados.

La solución es configurar Guice a "Filtro" peticiones "a través de" un filtro en su lugar:

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> 

Nota esta es una configuración filter en oposición a una configuración servlet .

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); 
      } 
     }); 
    } 
} 

Nota el uso de filter().through(); en lugar de serve().with();.

Esto permite que las solicitudes estáticas y jsp (¡e incluidas!) Pasen al siguiente enlace en la cadena de filtros, y finalmente a los manejadores de contenido predeterminados.

También tenga en cuenta el uso anterior de la opción más reciente ServletContainer.FEATURE_FILTER_FORWARD_ON_404 como alternativa a la opción ServletContainer.PROPERTY_WEB_PAGE_CONTENT_REGEX más compleja para cuando esté satisfecho con las ubicaciones predeterminadas para su contenido estático.

Puede seguir usando las otras opciones enumeradas en la pregunta original.

Para el siguiente paso, también puede incluir refer to this question específicamente un problema que tuve al agregar Guice AOP en esta configuración para trabajar junto con Guice Dependency Injection, Jersey REST Services, Contenido estático (JavaScript, CSS, Images) y regresar JSP Viewables .

Cuestiones relacionadas