我的服务方法生成其中一个MediaTypes
,它可能会生成pdf
或excel
个文件或其他文件。
@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();
答案 0 :(得分:2)
正如documenation中所述:
@GET
@Produces({"application/xml", "application/json"})
public String doGetAsXmlOrJson() {
...
}
如果任何一种媒体类型" application / xml"将调用doGetAsXmlOrJson方法。和" application / json"是可以接受的如果两者都同样可以接受,那么前者将被选中,因为它首先出现。
此外,您可以使用quality factor
来指定哪种媒体类型更为可取:
@Produces({"application/xml; qs=0.9", "application/json"})
。
无论如何,如果您想确定使用的媒体类型,您应该将方法划分为两个不同的签名。
答案 1 :(得分:2)
JAX-RS方法应将首选内容类型基于请求的Accept
标头的值。如果不这样做,它应该默认为第一个指定的。
虽然JAX-RS spec在这个问题上有些模糊,但Jersey documentation在描述选择机制时非常明确。
答案 2 :(得分:0)
JAX-RS实现使用@Produces
注释将传入请求绑定到您的一个资源方法,具体取决于请求的accept
标头。
如果要特别强制实施一种媒体类型,可以使用Response
在返回的ResponseBuilder#type(MediaType)
对象中设置确切的响应类型。
如果要匹配传入请求的accept
标头(在您的情况下为“application / vnd.ms-excel”vs“application / pdf”),则可以通过添加注释参数来检索该标头在Java方法中使用@HeaderParam("accept")
。
HTH。