在JAX-RS资源方法中获取原始请求体

时间:2013-04-22 14:21:18

标签: java http rest jax-rs

如何从{JAR-RS资源方法java.io.InputStreambyte[]访问原始请求正文?我希望容器绕过特定资源类或方法的任何MessageBodyReader,但我在项目中有其他资源应该使用一些MessageBodyReader

我已尝试过此操作,但会调用已注册的MessageBodyReader,但无法将结果分配给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。

3 个答案:

答案 0 :(得分:17)

只是这有助于任何人

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

    }

答案 1 :(得分:10)

这对我有用:

@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));
}

答案 2 :(得分:2)

我发现注入HttpServletRequest的原因不起作用,因为我确实在Jersey Test Framework中运行了我的代码,而不是在正确的Servlet容器中运行。如果我在一个合适的Servlet容器中运行它,它就可以工作。

遗憾的是,没有纯粹的JAX-RS获取原始请求体的方法。