web-dev-qa-db-fra.com

Obtenez HttpServletRequest dans l'application Jax Rs / Appfuse?

J'ai créé un shell d'application de base avec AppFuse et suivi le tutoriel AppFuse pour créer un service RESTful simple avec Jax-RS. Cela fonctionne très bien. Un appel à http://localhost:8080/services/api/persons renvoie une collection d'objets Person sous forme de chaîne au format Json avec les bonnes données.

Je voudrais maintenant accéder aux objets ServletRequest et ServletResponse à partir d'un service RESTful exposé par Appfuse (pour utiliser une autre bibliothèque qui nécessite ces objets).

Je pense que cela devrait être possible en ajoutant une annotation @Context, par ex. après cela StackOverflow post et ceci forum post .

Mais si j'ajoute la balise @Context (voir ci-dessous), elle se compile bien mais lève une exception lorsque le serveur est redémarré (attaché en bas).

Voici la déclaration du @WebService:

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

Et voici la classe d'implémentation où je pense que j'appellerais le @Context annotation:

@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 
    ... 
    } 

J'espère qu'il me manque quelque chose de simple, soit quelque chose à inclure pour le faire fonctionner, ou pour se rendre compte que l'obtention du ServletRequest n'est pas censé être possible parce que ... Tout indice serait le bienvenu.

Suis en cours d'exécution sur Tomcat dans IntelliJ.

=== EXCEPTION STACK TRACE (tronqué) ===

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 
26
prototype

Essayez d'injecter les HttpServletRequest et HttpServletContext directement:

@Context private HttpServletRequest servletRequest;
@Context private HttpServletContext servletContext;
40
Perception

L'ajouter à la signature de la méthode a fonctionné. J'imagine que c'est parce que les objets de demande et de réponse n'existent pas encore lorsque la classe est instanciée, mais le font lorsqu'ils sont appelés par le navigateur.

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