2017-02-22 45 views
0

我是JAX-RS的新手,有很多問題(這讓我很懷念SOAP)。這是我的代碼片段。 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和數組類型嗎?我通過@BeanParam,@MatrixParam和@QueryParam在線觀看了很多辯論。由於我不知道前兩個做什麼,我決定保持簡單。

任何幫助,將不勝感激。

+0

我不知道,如果你得到警告實際上是相關的代碼你已經呈現爲您不必在方法的類型Response'的'參數。您的一般設計有兩個缺陷IMO:使用HTTP POST而不是GET來上傳文件。 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進行編碼並作爲查詢參數傳遞,雖然這在任何方面都不是很美麗 –