2014-06-17 101 views
2

我的服務方式生產其中MediaTypes它可能會生產pdfexcel文件或其他。@JAX-RS生產註釋

@Produces({"application/pdf","application/vnd.ms-excel"... 

我的問題

我的服務返回的響應類型與application/pdf始終即使它產生excel。爲什麼?

比我重新排列MediaTypes

@Produces({"application/vnd.ms-excel","application/pdf",... 

現在它給所有響應類型application/vnd.ms-excel又是爲什麼?

我使用的客戶端com.sun.jersey API,並通過使用

clientResponse.getType() 

越來越型大概我想我誤解@Produces標註的概念。

請澄清。


以下是我的服務方法的代碼。

response = Response.ok((Object) file);//file is Object of File 
response.header("Content-Disposition","attachment; filename="+filename); 
//filename can be a.pdf b.xlsx etc 
return response.build(); 

回答

2

正如在documenation說:

@GET 
@Produces({"application/xml", "application/json"}) 
public String doGetAsXmlOrJson() { 
    ... 
} 

的doGetAsXmlOrJson方法如果或者媒體類型的 「application/XML」 和 「應用程序/ JSON」 的是可接受的將被調用。 如果兩者同樣可以接受,那麼前者將被選中,因爲它首先發生。

此外,您還可以使用quality factor爲specifing哪些媒體類型是更可取: @Produces({"application/xml; qs=0.9", "application/json"})

無論如何,如果你想確定使用哪種媒體類型,你應該將你的方法分成兩個不同的簽名。

+0

不適用於我..我使用球衣2.15.Service默認返回XML ...任何想法? – Anand

2

JAX-RS方法應該將首選內容類型基於請求的Accept標頭的值。如果沒有,它應該默認爲第一個指定的。

儘管JAX-RS spec在這個問題上有些模糊,但在描述選擇機制方面Jersey documentation非常明確。

0

JAX-RS實現使用@Produces註釋根據請求的標頭accept將傳入請求綁定到您的某個資源方法。

如果要特別強制執行一種媒體類型,則可以使用ResponseBuilder#type(MediaType)在返回的Response對象中設置響應的確切類型。

如果你想進入的請求(「應用程序/ vnd.ms - Excel的」與你的情況「應用程序/ PDF格式」)的accept報頭相匹配,您可以通過添加與@HeaderParam("accept")在註釋參數檢索標題你的Java方法。

HTH。