15

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

我已经尝试过了,但它会调用已注册MessageBodyReader的 s 并且无法将结果分配给InputStream(与 相同的问题byte[])。

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

我也试过这个,但是容器无法初始化并出现这个错误:

严重:在资源和/或提供程序类中检测到以下错误和警告:
严重:在索引 0 的参数处缺少方法 public javax.ws.rs.core.Response SomeResource.post(javax.servlet.http.HttpServletRequest) 的依赖项
严重:方法,公共 javax.ws.rs.core.Response SomeResource.post(javax.servlet.http.HttpServletRequest),用资源的 POST 注释,类 SomeResource,不被识别为有效的资源方法。
@POST
public Response post(@Context HttpServletRequest request) {
    String contentType = request.getContentType();
    InputStream requestBody = request.getInputStream();
    // ... 
}

该方法位于子资源类中,该子资源类是从具有@Path另一个资源类中的注释的方法创建的。

我正在使用泽西岛 1.11。

4

3 回答 3

20

以防万一这可以帮助任何人

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

    }
于 2014-06-14T19:44:38.197 回答
10

This works for 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));
}
于 2014-01-31T09:54:07.893 回答
2

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

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

于 2013-04-23T16:30:09.847 回答