46.5. 使用子资源


概述

可能需要由多个资源处理服务。例如,在处理服务最佳实践时,建议每个客户都作为唯一资源进行处理。每个顺序也会作为唯一资源进行处理。

使用 JAX-RS API,您将实施客户资源和子资源 的顺序。子资源是通过 root 资源类访问的资源。它们通过将 @Path 注释添加到资源类的方法来定义。子资源可以通过以下两种方式之一实现:

指定子资源

子资源通过减少带有 @Path 注释的方法来指定。子资源的 URI 如下:

  1. 将子资源 @Path 注释的值附加到子资源的父资源的 @Path 注释的值。

    父资源的 @Path 注释可能位于资源类上,该方法返回包含子资源的类对象。

  2. 重复上一步,直到达到 root 资源。
  3. assembled URI 附加到部署该服务的基本 URI 中。

例如,例 46.6 “订购子资源” 中显示的子资源的 URI 可以是 baseURI/customerservice/order/12

例 46.6. 订购子资源

...
@Path("/customerservice/")
public class CustomerService
{
  ...
  @Path("/orders/{orderId}/")
  @GET
  public Order getOrder(@PathParam("orderId") String orderId)
  {
    ...
  }
}

子资源方法

子资源方法使用 @Path 注释和其中一个 HTTP 动词注释进行解码。子资源方法直接负责处理使用指定的 HTTP 动词对资源发出的请求。

例 46.7 “子资源方法” 显示具有三个子资源方法的资源类:

  • getOrder () 处理 URI 与 /customerservice/orders/{orderId}/ 匹配的资源的 HTTP GET 请求。
  • updateOrder () 处理 URI 与 /customerservice/orders/{orderId}/ 匹配的资源的 HTTP PUT 请求。
  • newOrder () 处理位于 /customerservice/orders/ 的资源的 HTTP POST 请求。

例 46.7. 子资源方法

...
@Path("/customerservice/")
public class CustomerService
{
  ...
  @Path("/orders/{orderId}/")
  @GET
  public Order getOrder(@PathParam("orderId") String orderId)
  {
    ...
  }

  @Path("/orders/{orderId}/")
  @PUT
  public Order updateOrder(@PathParam("orderId") String orderId,
                           Order order)
  {
    ...
  }

  @Path("/orders/")
  @POST
  public Order newOrder(Order order)
  {
    ...
  }
}
注意

具有相同 URI 模板的子资源方法等同于子资源 locator 返回的资源类。

子资源 locators

子资源 locator 与 HTTP 动词注解之一不分离,且不会直接处理子资源。相反,子资源 locator 返回可处理请求的资源类实例。

除了没有 HTTP 动词注解外,sub-resource locators 也不能有任何实体参数。子资源 locator 方法使用的所有参数都必须使用 第 47 章 将信息传递给资源类和方法 中描述的其中一个注解。

例 46.8 “子资源 locator 返回特定类” 所示,子资源 locator 允许您将资源封装为可重复使用的类,而不是将所有方法放在一个超级类中。processOrder () 方法是一个子资源 locator。当请求在与 URI 模板 /orders/{orderId}/ 匹配的 URI 上时,它会返回 Order 类的实例。Order 类具有使用 HTTP 动词注解分离的方法。PUT 请求由 updateOrder () 方法处理。

例 46.8. 子资源 locator 返回特定类

...
@Path("/customerservice/")
public class CustomerService
{
  ...
  @Path("/orders/{orderId}/")
  public Order processOrder(@PathParam("orderId") String orderId)
  {
    ...
  }

  ...
}

public class Order
{
  ...
  @GET
  public Order getOrder(@PathParam("orderId") String orderId)
  {
    ...
  }

  @PUT
  public Order updateOrder(@PathParam("orderId") String orderId,
                           Order order)
  {
    ...
  }

}

子资源 locator 在运行时处理,以便它们可以支持 polymorphism。子资源 locator 的返回值可以是通用 对象、抽象类或类层次结构的顶部。例如:如果您的服务需要处理 PayPal 订单和信用卡订单,则 例 46.8 “子资源 locator 返回特定类” 中的 processOrder () 方法的签名可能会保持不变。您只需要实施两个类,即 ppOrderccOder,它们扩展了 Order 类。processOrder () 的实现会根据需要的逻辑实例化子资源所需的实现。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.