REST子资源定位器

时间:2015-03-01 11:32:03

标签: java rest jax-rs

我正在阅读 RESTful Java with JAX-RS 2.0,2nd Edition 这本书,我正在努力了解Subresource Locators的工作原理,下面是所提供示例的简化版本。

CustomerDatabaseResource类

@Path("/customers")
public class CustomerDatabaseResource {

   @Path("{database}-db")
   public CustomerResource getDatabase(@PathParam("database") String db) {
      // find the instance based on the db parameter
      CustomerResource resource = locateCustomerResource(db);
      return resource;
   }

   protected CustomerResource locateCustomerResource(String db) {
     ...
   }
}

CustomerResource Class

public class CustomerResource {
   private Map<Integer, Customer> customerDB =
                          new ConcurrentHashMap<Integer, Customer>();
   private AtomicInteger idCounter = new AtomicInteger();

   public CustomerResource(Map<Integer, Customer> customerDB)
   {
      this.customerDB = customerDB;
   }

   @GET
   @Path("{id}")
   @Produces("application/xml")
   public StreamingOutput getCustomer(@PathParam("id") int id) {
     ...
   }

所以我理解,当GET /customers/northamerica-db/333之类的请求进来时,将首先匹配基于位置的方法CustomerDatabaseResource.getDatabase()上的表达式,将创建CustomerResource的正确实例。

我不明白接下来会发生什么......

  1. 返回实例resource,但返回到哪里?

  2. Web服务如何知道然后使用方法CustomerResource.getCustomer()匹配并处理请求的剩余部分?我想这是因为CustomerDataBaseResource类没有@GET,但我真的不明白转换是如何发生的。

  3. 这是否特定于RESTEasy?

1 个答案:

答案 0 :(得分:2)

  
      
  1. 返回实例资源,但返回到哪里?
  2.   

它被返回到请求处理引擎并继续寻找匹配方法(在返回资源对象内),就像任何其他请求一样。

  
      
  1. Web服务如何知道然后使用方法CustomerResource.getCustomer()匹配和处理请求的剩余部分?我想这是因为CustomerDataBaseResource类没有@GET,但我真的不明白转变是如何发生的。
  2.   

资源定位器不应该使用Http方法进行注释。这就是他们被称为定位器的方式。由于它不是要调用的资源方法,因此不应对其进行注释。想象一下这个

public class CustomerResource {
    @PUT
    @Path("{id}")
    public Response updateCustomer(Customer customer) {}
    @POST
    @Path("{id}")
    public Response createCustomer(Customer customer) {}
}

如果要使用Http方法注释CustomerDataBaseResource.getDatabase(),那么我们就无法使用上述方法。所有定位器需求都是@Path,URI匹配将从该路径开始继续。

/customers/database-us

创建CustomerResource后,如果请求uri为/customers/database-us/123,那么现在下一个逻辑步骤是根据URI查找匹配的资源方法,因此将查找注释的内容与@Path匹配的123。然后检查Http方法。

  
      
  1. 这是否特定于RESTEasy?
  2.   

通过jax-rs spec,我看不到有关子资源定位器的任何信息,但Jersey also implements this exact behavior。我已经阅读了你所指的那本书,而且从我记忆中来看,作者并没有真正了解任何具体实现的内容,但确实提到了大多数实施者实施的常见功能,这不是规范的一部分。也许这就是其中之一。


<强>更新

因此规范中的。转到链接并下载规范。您会在3.4.1 Sub Resources下找到所有内容以及3.7.2 Request Matching

中请求匹配的一些算法信息