2012-03-08 10 views
23

Ho creato una shell dell'applicazione di base con AppFuse e ho seguito lo AppFuse tutorial per creare un semplice servizio RESTful con Jax-RS. Funziona bene. Una chiamata a http://localhost:8080/services/api/persons restituisce una raccolta di oggetti Person come stringa formattata con JSON con i dati corretti.Ottieni HttpServletRequest nell'applicazione Jax Rs/Appfuse?

Ora desidero accedere agli oggetti ServletRequest e ServletResponse da un servizio RESTful esposto da Appfuse (per utilizzare un'altra libreria che richiede questi oggetti).

I think che dovrebbe essere possibile aggiungendo un'annotazione @Context, ad es. seguendo questo StackOverflow post e questo forum post.

Ma se aggiungo il tag @Context (vedere di seguito), esso viene compilato correttamente ma genera un'eccezione quando il server viene riavviato (allegato in basso).

Ecco la dichiarazione del @WebService:

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

Ed ecco la classe di implementazione in cui penso che chiamerei il @Context annotazione:

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

Speriamo che mi manca qualcosa di semplice, sia qualcosa includere per farlo funzionare, o per rendersi conto che ottenere il ServletRequest non dovrebbe essere possibile perché .... Qualsiasi indizio sarebbe benvenuto.

Sono in esecuzione su Tomcat in IntelliJ.

=== ECCEZIONE STACK TRACE (troncata) ===

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 

risposta

33

Prova iniettando il HttpServletRequest e HttpServletContext direttamente:

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

Grazie mille! Anche se questo non ha funzionato esattamente come scritto, ha dato un'eccezione diversa e, oltre all'idea di fare riferimento a HttpServletRequest piuttosto che a ServletRequest, era l'indizio perfetto per capire come includerlo correttamente. Un +1 invece di un controllo appropriato? – prototype

+0

Hmmm questo è strano. Ho effettivamente incollato il codice direttamente da un programma funzionante. Sentiti libero di pubblicare la tua soluzione come risposta in modo che possa beneficiare gli altri. – Perception

+0

Quindi è necessario aggiungere un altro elemento alla mia lista di cose per sapere come funzionano i servizi di riposo. Sapere che è anche utile. Grazie ancora! – prototype

23

Aggiunta alla firma metodo lavorato. Immagino che sia perché gli oggetti request e response non esistono ancora quando la classe viene istanziata, ma quando viene chiamata dal brower.

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

Sorprendentemente funziona anche senza Spring o un altro framework CDI in uso. – coladict

Problemi correlati