2017-02-22 6 views
0

私はJAX-RSを使い始めていて、いくつかの問題があります。ここに私のコードのスニペットがあります。 getMergedPDFReportメソッドは、ある処理の後にファイルを取り、ファイルを返す必要があります。私はJAX-RSの問題

@GET 
@Produces("application/pdf") 
@Path("merge-service") 
public Response getMergedPDFReport(@QueryParam(ApiParameters.WORD_DOCUMENT) File wordDocument, 
            @QueryParam(ApiParameters.MERGE_FIELDS)Object[] fieldNames, 
            @QueryParam(ApiParameters.MERGE_VALUES) Object [] fieldValues) { 
    ResponseBuilder builder =null; 
    try { 
     File product = DocumentUtil.generatePDF(wordDocument, fieldNames, fieldValues); 

     builder = Response.ok(product); 
     builder.header("Content-Disposition", "attachment; filename=\\\"report.pdf\\\""); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return builder.build(); 
} 

クライアント心配と思われる後、私は「タイプ公共javax.ws.rs.core.Responseのパラメータが見つかりませ注入源」を言わない私のサーバーログに警告が表示されます。なぜか分からないようです。 2. @QueryParam注釈権限を使用していますか?私はそれをFileとArrayの型に使うべきですか? @BeanParam、@MatrixParam、@QueryParamについて、多くの議論がオンラインで見られました。最初の2つが何をするのか分からなかったので、私はそれを簡単にすることに決めました。

ご協力いただければ幸いです。

+0

私はあなたが得る警告が実際にあなたがその方法ではタイプ 'Response'のパラメータを持っていないとして、あなたが提示したコードに関連しているかはわからない:この

チェック。あなたの一般的なデザインにはいくつかの欠陥があります。IMO:GETではなくHTTP POSTを使用してファイルをアップロードします。 GETは安全で冪等の操作なので、リソースの状態を変更してはいけません。呼び出されるURIは、多くの場合、フレームワークの長さによって制限されます。エンコードされたファイルをクエリパラメータとして渡すと、URIの長さがかなり長くなり、拒否の可能性が高くなります。 –

答えて

0

ファイルに対してqueryParamを使用することはできないと思います。あなたはマルチパート形式で@Consumesを使用する必要があります。 http://www.javatpoint.com/jax-rs-file-upload-example

+0

コアの問題は、OPが 'GET'メソッドを使ってファイルを送信しようとしていることです。 [RFC 7231](https://tools.ietf.org/html/rfc7231#section-4.3.1)によると、GET要求で発行されたペイロードのセマンティクスは指定されていませんが、仕様はGETボディの使用を嫌うGET要求発行機関を拒否する可能性のある古いバージョンとの互換性を維持するためです。さらに、ファイルが実際に小さければ、それはbase64を使用してエンコードされ、クエリパラメータとして渡されることがありますが、これは決して美しくはありません –

関連する問題