web-dev-qa-db-ja.com

JAX-RSリソースメソッドで生のリクエストボディを取得する

Java.io.InputStreamまたはbyte[]のように、JAX-RSリソースメソッドから生のリクエスト本文にアクセスするにはどうすればよいですか?コンテナが特定のリソースクラスまたはメソッドのMessageBodyReaderをバイパスするようにしたいのですが、プロジェクトにはMessageBodyReaderを使用する必要のある他のリソースがあります。

これを試しましたが、登録済みのMessageBodyReadersが呼び出され、結果をInputStreamに割り当てることができません(byte[]と同じ問題)。

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

私もこれを試しましたが、コンテナはこのエラーで初期化に失敗します:

重大:リソースクラスやプロバイダークラスで次のエラーと警告が検出されました:
重大:メソッドpublic javax.ws.rs.core.Response SomeResource.post(javax。インデックス0 
 SEVEREのパラメーターでのservlet.http.HttpServletRequest):メソッド、public 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アノテーションを持つメソッドから作成されたサブリソースクラスにあります。

私はJersey1.11を使用しています。

14
Mikael Ståldal

これが誰かを助ける場合に備えて

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

    }
17
TPEACHES

これは私のために働きます:

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

HttpServletRequestの挿入が機能しなかった理由は、適切なサーブレットコンテナ内ではなく、Jersey TestFrameworkでコードを実行したためです。適切なサーブレットコンテナで実行すると機能します。

生のリクエスト本文を取得する純粋なJAX-RSの方法がないのは残念です。

2
Mikael Ståldal