2013-04-22 72 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(); 

    }