2013-04-22 39 views
8

如何從JAX-RS資源方法訪問原始請求體,如java.io.InputStreambyte[]?我希望容器繞過特定資源類或方法的任何MessageBodyReader,但是我應該使用一些MessageBodyReader的項目中有其他資源。使用JAX-RS資源方法獲取原始請求體

我試過這個,但它會調用註冊的MessageBodyReader s並且未能將結果分配給InputStream(與byte[]同樣的問題)。

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

我也試過,但隨後的容器失敗,此錯誤初始化:

 
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(); 
    // ... 
} 

的方法是在一個子資源類,它是從一個方法創建了另一個資源類中的@Path註釋。

我正在使用Jersey 1.11。

+0

你的第二個錯誤似乎並不相關的'@ Context'錯誤。你有一個類級別的'@ Path'註釋嗎? – Perception 2013-04-22 14:31:00

+0

不,但它實際上是一個子資源,通過@Path註釋從另一個資源類中的方法調用。如果我刪除了HttpServletRequest參數(但我不會得到正文),它確實有效。 – 2013-04-22 14:51:39

回答

1

我發現注入HttpServletRequest不起作用的原因,這是因爲我在澤西測試框架中運行我的代碼,而不是在適當的Servlet容器中運行。如果我在一個適當的Servlet容器中運行它,它會起作用。

很遺憾,沒有純粹的JAX-RS獲取原始請求體的方式。

+0

爲什麼這不是純粹的jaxrs方式? – 2013-10-25 00:58:03

+1

@David Williams因爲HttpServletRequest是servlet api的一部分,而不是jaxrs。如果你想使用內存之類的低級澤西測試容器進行集成測試,你將無法使用servlet api。 – 2014-03-14 13:28:34

+0

明白了,謝謝。 – 2014-03-14 18:51:53

9

這個工作對我來說:

@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

只是櫃面這可以幫助任何人

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(); 

    }