为什么要使用REST @Produces注释

所以我明白你是在指定类型,但为什么呢? 在什么条件下才重要。 例如,如果我有以下方法,并且我注释掉@Produces注释,它仍然返回JSON。

@GET @Path("/json") //@Produces({MediaType.APPLICATION_JSON}) public String getJson(){ return toJson(getResults()); } 

API文档说’如果没有指定,那么容器将假定可以生成任何类型。’ 那么为什么我不想让容器承担这个呢?

我认为这取决于你的JAX-RS实现,但这里是泽西岛对他们的@Produces注释的解释: https ://jersey.java.net/documentation/latest/jaxrs-resources.html#d0e1809

基本上,由客户端决定服务器应该回吐的内容类型。 如果客户端支持多种内容类型,则有时可以为给定方法指定要返回的内容类型的优先级:

 @Produces({"application/xml; qs=0.9", "application/json"}) 

在上面的示例中,如果客户端同时接受“application / xml”和“application / json”(同等),则服务器始终发送“application / json”,因为“application / xml”具有较低的品质因数。

如果客户端使用Accept: application/xml;请求您的仅JSON资源Accept: application/xml; 标题然后严格来说服务器应该返回406 (不可接受)状态代码,而不是JSON字符串。

如果您使用@Provides注释,容器应该为您处理这种情况,这就是您应该使用它的原因。