@Produces注解

来源:互联网 发布:广州白云行知职业技术学校 编辑:程序博客网 时间:2024/06/09 19:12

《Java RESTful Web Service实战(第2版)》第2章REST API设计,本章是REST理论和Jersey实践的核心章节,详细讲述了HTTP方法与REST API的统一接口设计、URI的REST风格设计,并逐个讲述了JAX-RS2定义的注解如何支持资源定位,还对Jersey对各种表述类型的支持和实现、Jersey对REST连通性的两种实现、REST资源方法对响应的处理以及Jersey对内容协商的支持和实现进行了讲述。本节为大家介绍@Produces注解。


注解@Produces 用于定义方法的响应实体的数据类型,可以定义一个或多个,同时可以为每种类型定义质量因素(qualityfactor) 。质量因素是取值范围从0到1的小数值。如果不定义质量因素,那么该类型的质量因素默认为1。我们将结合示例深入了解@Produces注解对媒体类型的影响,示例代码如下。

@Path("conneg-resource")  public class ConnegResource {    @GET    @Path("{id}")    //关注点1:媒体类型为XML    @Produces(MediaType.APPLICATION_XML)    public Book getJaxbBook(@PathParam("id") final Long bookId) {        return new Book(bookId);    }    @GET    @Path("{id}")    //关注点2:媒体类型为JSON    @Produces(MediaType.APPLICATION_JSON)    public Book getJsonBook(@PathParam("id") final Long bookId) {        return new Book(bookId);    }  } 

在这段代码中,getJaxbBook()和getJsonBook()是同等质量因素、资源地址相同的两个GET方法,一个定义响应实体格式为XML,一个定义响应实体格式为JSON,见关注点1和2。那么对同一个资源的访问,JAX-RS2该如何选择处理方法呢?如果请求中明确定义可接受的数据类型为两者之一,处理方法应该是定义相应数据类型的方法。如果两者都定义了,处理方法应该是质量因素高的方法。如果两者都定义,而且数据类型的质量因素是相等的或者没有定义Accept,XML的方法会被优先选择。