Java.io.InputStream
またはbyte[]
のように、JAX-RSリソースメソッドから生のリクエスト本文にアクセスするにはどうすればよいですか?コンテナが特定のリソースクラスまたはメソッドのMessageBodyReader
をバイパスするようにしたいのですが、プロジェクトにはMessageBodyReader
を使用する必要のある他のリソースがあります。
これを試しましたが、登録済みのMessageBodyReader
sが呼び出され、結果を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を使用しています。
これが誰かを助ける場合に備えて
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();
}
これは私のために働きます:
@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));
}
HttpServletRequestの挿入が機能しなかった理由は、適切なサーブレットコンテナ内ではなく、Jersey TestFrameworkでコードを実行したためです。適切なサーブレットコンテナで実行すると機能します。
生のリクエスト本文を取得する純粋なJAX-RSの方法がないのは残念です。