@Jroduces在JAX-RS中的注释

时间:2014-06-17 06:47:00

标签: java annotations jax-rs

我的服务方法生成其中一个MediaTypes,它可能会生成pdfexcel个文件或其他文件。

@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();

3 个答案:

答案 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。