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();
}
Hola amigo, ¿hay algo de suerte con este problema? Parece que estoy obteniendo lo mismo –
No, me encuentro llamando a JSP desde el código, feo pero funciona. Se agregará como una "respuesta" –
Terminé abandonando JSP y fui con Freemarker. –