2011-08-08 11 views
6

Versión de JBoss: 4.2.3GA. Esto funciona en apache tomcat 6.0. En JBoss, tuve que agregar la siguiente configuración: -Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=false para hacer que el reenvío funcione, pero ahora cuando cargo la página aparece el siguiente error. Siento que estoy haciendo esto de una manera que a JBoss no le gusta, pero no he visto ningún otro ejemplo. ¿Alguien sabe una forma de hacer que esto funcione?¿Cómo reenviar de un servicio JAX-RS a JSP?

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 

... 


@GET 
@Path("/forward") 
public String forward(
    @Context final HttpServletRequest request, 
    @Context final HttpServletResponse response) throws Exception 
{ 
    RequestDispatcher dispatcher = request.getRequestDispatcher("/index.html"); 
    dispatcher.forward(request, response); 
    return ""; 
} 

La excepción:

java.lang.ClassCastException: $Proxy114 cannot be cast to javax.servlet.ServletRequestWrapper 
    com.itt.scout.server.servlet.admin.config.ConfigController.forward(ConfigController.java:46) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$VoidOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:151) 
    com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:70) 
    com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:279) 
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:136) 
    com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:86) 
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:136) 
    com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:74) 
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1357) 
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1289) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1239) 
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1229) 
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420) 
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:497) 
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:684) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 
+0

No está utilizando directamente los servlets. Está utilizando JAX-WS (servicios web). Eliminé la referencia y la etiqueta "servlet". Para saber qué es realmente un servlet real, consulte nuestra página wiki de servlets http://stackoverflow.com/tags/servlets/info – BalusC

+0

Estoy haciendo MVC con un controlador de restlet y una vista jsp. Esto probablemente se veía raro en mi ejemplo porque no debería haber enviado las solicitudes de esa manera. –

Respuesta

14

Después de conseguir un poco de ayuda desde otro lugar, me di cuenta que estaba conectando mi JSP y Restlet de una manera divertida, y lo que realmente quería hacer era utilizar una Visible. Esto también funciona mucho mejor en JBoss. Aquí es un resumen de lo que terminó con:

import javax.ws.rs.core.Context; 
import javax.ws.rs.Path; 
import javax.ws.rs.GET; 
import com.sun.jersey.api.view.Viewable; 


@GET 
@Path("/index") 
public Viewable index(
    @Context HttpServletRequest request, 
    @Context HttpServletResponse response) throws Exception 
{ 
    request.setAttribute("key", "value"); 
    return new Viewable("/jsps/someJsp.jsp", null); 
} 
+0

Gracias por esta respuesta. ¿Qué pasa si este método puede escribir una respuesta o reenviar a otro URI? Entonces, ¿este método puede devolver una respuesta o una vista? ¿Esto requeriría que declaremos este método para devolver un Objeto? – onejigtwojig

+0

Gracias por su respuesta. Me ayudó. – user

+0

Gracias, eso ayudó. El próximo desafío es cómo forzar una redirección, en lugar de un reenvío, a una página JSP. –

2

Si no está utilizando Jersey, es posible que desee hacer esto:

@Path("") 
@ApplicationPath("blog") 
@Stateless 
public class BlogApplication extends Application { 

    @EJB private PostEJB postEJB; 

    @GET 
    public void getHome(@Context HttpServletRequest request, 
         @Context HttpServletResponse response) { 
     request.setAttribute("posts", postEJB.getPosts()); 
     request.getRequestDispatcher("/WEB-INF/pages/blog/home.jsp") 
       .forward(request, response); 
    } 

    @Override 
    public Set<Class<?>> getClasses() { 
     return new HashSet<Class<?>>(Arrays.asList(BlogApplication.class)); 
    } 

} 
Cuestiones relacionadas