我正在阅读 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的正确实例。
我不明白接下来会发生什么......
返回实例resource
,但返回到哪里?
Web服务如何知道然后使用方法CustomerResource.getCustomer()
匹配并处理请求的剩余部分?我想这是因为CustomerDataBaseResource类没有@GET
,但我真的不明白转换是如何发生的。
这是否特定于RESTEasy?
答案 0 :(得分:2)
- 返回实例资源,但返回到哪里?
醇>
它被返回到请求处理引擎并继续寻找匹配方法(在返回资源对象内),就像任何其他请求一样。
- Web服务如何知道然后使用方法
醇>CustomerResource.getCustomer()
匹配和处理请求的剩余部分?我想这是因为CustomerDataBaseResource
类没有@GET
,但我真的不明白转变是如何发生的。
资源定位器不应该使用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方法。
- 这是否特定于RESTEasy?
醇>
通过jax-rs spec,我看不到有关子资源定位器的任何信息,但Jersey also implements this exact behavior。我已经阅读了你所指的那本书,而且从我记忆中来看,作者并没有真正了解任何具体实现的内容,但确实提到了大多数实施者实施的常见功能,这不是规范的一部分。也许这就是其中之一。
<强>更新强>
因此规范中的是。转到链接并下载规范。您会在3.4.1 Sub Resources
下找到所有内容以及3.7.2 Request Matching