JBoss.orgCommunity Documentation

第 18 章 JAX-RS Resources定位器和子Resources

Resources类能够处理请求的一部分,并提供另一个"sub"Resources对象来处理请求的其余部分。例如:

@Path("/")
public class ShoppingStore {

    @Path("/customers/{id}")
    public Customer getCustomer(@PathParam("id") int id) {
        Customer cust = ...; // Find a customer object
        return cust;
    }
}

public class Customer {
   
    @GET
    public String get() {...}

    @Path("/address")
    public String getAddress() {...}
}

具有 @Path 注释但没有 HTTP 方法的Resources方法被视为子Resources定位器。他们的工作是提供一个可以处理请求的对象。在上面的示例中,ShoppingStore 是一个根Resources,因为它的类带有 @Path 注释。getCustomer() 方法是子Resources定位器方法。

如果客户端调用:

GET /customer/123

ShoppingStore.getCustomer() 方法将首先被调用。此方法提供了一个 Customer 对象,可以为请求提供服务。Http 请求将被分派给 Customer.get() 方法。另一个例子是:

GET /customer/123/address

在这个请求中,首先调用 ShoppingStore.getCustomer() 方法。返回一个 customer 对象,并将请求的其余部分分派给 Customer.getAddress() 方法。

子Resources定位器的另一个有趣特性是定位器方法结果在运行时动态处理,以确定如何分派请求。因此,ShoppingStore.getCustomer() 方法不必声明任何特定类型。

@Path("/")
public class ShoppingStore {

   @Path("/customers/{id}")
   public java.lang.Object getCustomer(@PathParam("id") int id) {
      Customer cust = ...; // Find a customer object
      return cust;
   }
}

public class Customer {
   
    @GET
    public String get() {...}

    @Path("/address")
    public String getAddress() {...}
}

在上面的示例中,getCustomer() 返回一个 java.lang.Object 。在运行时,根据每个请求,JAX-RS 服务器将根据 getCustomer() 返回的对象确定如何分派请求。这有什么用呢?好吧,也许你为你的客户有一个类层次结构。Customer 是抽象基,CorporateCustomer 和 IndividualCustomer 是子类。您的 getCustomer() 方法可能正在执行 Hibernate 多态查询,并且不知道或不关心它查询的具体类是什么,或者它返回什么。

@Path("/")
public class ShoppingStore {

   @Path("/customers/{id}")
   public java.lang.Object getCustomer(@PathParam("id") int id) {
      Customer cust = entityManager.find(Customer.class, id);
      return cust;
   }
}

public class Customer {
   
    @GET
    public String get() {...}

    @Path("/address")
    public String getAddress() {...}
}

public class CorporateCustomer extends Customer {
   
    @Path("/businessAddress")
    public String getAddress() {...}
}