2012-03-08 8 views
23

Creé un shell de aplicaciones básicas con AppFuse, y seguí el AppFuse tutorial para crear un servicio RESTful simple con Jax-RS. Eso funciona bien. Una llamada al http://localhost:8080/services/api/persons devuelve una colección de objetos Person como una cadena con formato Json con los datos correctos.Obtenga HttpServletRequest en la aplicación Jax Rs/Appfuse?

Ahora me gustaría acceder a los objetos ServletRequest y ServletResponse desde un servicio RESTful expuesto por Appfuse (para usar otra biblioteca que requiera estos objetos).

I piensa que debería ser factible agregando una anotación @Context, p. siguiendo este StackOverflow post y este forum post.

Pero si agrego la etiqueta @Context (ver a continuación), compila bien pero arroja una excepción cuando se reinicia el servidor (se adjunta en la parte inferior).

Aquí está la declaración de la @WebService:

@WebService 
@Path("/persons") 
public interface PersonManager extends GenericManager<Person, Long> { 
    @Path("/") 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    List<Person> read(); 
    ... 
} 

Y aquí es la clase de implementación en el que creo que yo llamaría el @Context anotación:

@Service("personManager") 
public class PersonManagerImpl extends GenericManagerImpl<Person, Long> implements PersonManager { 
    PersonDao personDao; 
    @Context ServletRequest request; // Exception thrown on launch if this is present 
    @Context ServletContext context; // Exception thrown on launch of this is present 
    ... 
    } 

suerte que me falta algo simple, ya sea algo incluir para que funcione, o para darse cuenta de que no se supone que obtener ServletRequest sea posible porque .... Cualquier pista sería bienvenida.

Estoy ejecutando esto en Tomcat en IntelliJ.

=== TRACE EXCEPCIÓN PILA (truncado) ===

Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are: 
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'serviceBeans' threw exception; nested exception is java.lang.RuntimeException: java.lang.NullPointerException 
     at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:102) 
     at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:58) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1358) 
     ... 37 more 

Respuesta

33

Trate inyectar el HttpServletRequest y HttpServletContext directamente:

@Context private HttpServletRequest servletRequest; 
@Context private HttpServletContext servletContext; 
+1

¡Muchísimas gracias! Aunque esto no funcionó exactamente como estaba escrito, dio una excepción diferente, y eso más la idea de hacer referencia a HttpServletRequest en lugar de solo ServletRequest fue la pista perfecta para descubrir cómo incluirlo correctamente. ¿Es apropiado un +1 en lugar de un cheque? – prototype

+0

Hmmm eso es extraño. De hecho, pegué el código directamente desde un programa en funcionamiento. Siéntase libre de publicar su solución como una respuesta para que pueda beneficiar a los demás. – Perception

+0

Luego debe haber otro artículo que necesite agregar a mi lista de cosas para aprender cómo funcionan los servicios de descanso. Saber eso también es útil. ¡Gracias de nuevo! – prototype

23

de añadir a la firma del método funcionó. Imagino que es porque los objetos de solicitud y respuesta aún no existen cuando se crea una instancia de la clase, pero lo hace cuando el brower lo llama.

@Path("/") 
@GET 
@Produces(MediaType.APPLICATION_JSON) 
List<Person> read(@Context HttpServletRequest httpServletRequest, @Context HttpServletResponse httpServletResponse) { } 
+0

Sorprendentemente, esto funciona incluso sin Spring u otro framework CDI en uso. – coladict

Cuestiones relacionadas