2013-04-22 11 views
8

Come accedere al corpo della richiesta non elaborato da un metodo risorsa JAX-RS, come java.io.InputStream o byte[]? Voglio che il contenitore ignori qualsiasi MessageBodyReader per una specifica classe di risorse o un metodo, ma ho altre risorse nei progetti che dovrebbero utilizzare alcuni MessageBodyReader.Ottenimento corpo di richiesta non elaborato nel metodo risorsa JAX-RS

Ho provato, ma invocherò registrato MessageBodyReader s e non riesco ad assegnare il risultato a InputStream (stesso problema con byte[]).

@POST 
public Response post(@Context HttpHeaders headers, InputStream requestBody) { 
    MediaType contentType = headers.getMediaType(); 
    // ... 
} 

ho anche provato, ma poi il contenitore non riesce a inizializzare con questo errore:

 
SEVERE: The following errors and warnings have been detected with resource and/or provider classes: 
SEVERE: Missing dependency for method public javax.ws.rs.core.Response SomeResource.post(javax.servlet.http.HttpServletRequest) at parameter at index 0 
SEVERE: Method, public javax.ws.rs.core.Response SomeResource.post(javax.servlet.http.HttpServletRequest), annotated with POST of resource, class SomeResource, is not recognized as valid resource method. 
@POST 
public Response post(@Context HttpServletRequest request) { 
    String contentType = request.getContentType(); 
    InputStream requestBody = request.getInputStream(); 
    // ... 
} 

Il metodo è in una classe sub risorsa, che viene creato da un metodo con un'annotazione @Path in un'altra classe di risorsa.

Sto usando Jersey 1.11.

+0

Il tuo secondo errore non sembra correlato a un errore di '@ Context'. Hai un'annotazione '@ Path' a livello di classe? – Perception

+0

No, ma in realtà è una sottorisorsa, invocata da un metodo in un'altra classe di risorsa con un'annotazione @Path. Funziona se rimuovo il parametro HttpServletRequest (ma poi non otterrò il corpo). –

risposta

1

Ho trovato il motivo per cui l'iniezione di HttpServletRequest non ha funzionato, è perché ho eseguito il mio codice in Jersey Test Framework, non all'interno di un contenitore Servlet appropriato. Funziona se lo eseguo in un contenitore Servlet appropriato.

È un peccato che non ci sia un puro metodo JAX-RS per ottenere il corpo della richiesta grezza.

+0

Perché non è un modo puro jaxrs? –

+1

@David Williams Perché HttpServletRequest è parte di servlet api, non jaxrs. E se vuoi fare un test di integrazione con un contenitore di test jersey di basso livello come quello in-memory, non potrai usare l'api servlet. –

+0

Capito, grazie. –

9

questo funziona per me:

@POST 
@Consumes(MediaType.WILDCARD) 
@Produces(MediaType.WILDCARD) 
public Response doSomething(@Context HttpServletRequest request, byte[] input) { 
    log.debug("Content-Type: {}", request.getContentType()); 
    log.debug("Preferred output: {}", request.getHeader(HttpHeaders.ACCEPT)); 
} 
12

solo in caso questo aiuta chiunque

public Response doAThing(@Context HttpServletRequest request, InputStream requestBody){ 


     BufferedReader reader = new BufferedReader(new InputStreamReader(requestBody)); 
     StringBuilder out = new StringBuilder(); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      out.append(line); 
     } 
     System.out.println(out.toString()); //Prints the string content read from input stream 
     reader.close(); 

     return Response.ok().entity("{\"Submit\": \"Success\"}").build(); 

    } 
Problemi correlati