2014-06-17 38 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。