47.2.6. 将参数注入 Java Bean

概述

在通过 REST 发布 HTML 表单时,服务器端的常用模式是创建一个 Java bean 来封装以形式接收的所有数据(还可能来自其他参数和 HTML 标头的数据)。通常,创建此 Java bean 属于两步过程:资源方法通过注入(例如,通过将 @FormParam 注释添加到其方法参数)接收表单值,而资源方法则调用 bean 的构造器,并以表单数据传递。

使用 JAX-RS 2.0 @BeanParam 注释,可以在一个步骤中实施此模式。表格数据可以直接注入到 bean 类的字段中,而 bean 本身由 JAX-RS 运行时自动创建。这是示例最为容易解释。

注入目标

@BeanParam 注释可以附加到资源方法参数、资源字段或 bean 属性。但是,参数目标是唯一可用于所有资源类生命周期的目标类型。另一种目标类型仅限于每个请求的生命周期。表 47.1 “@BeanParam Injection Targets” 中总结了这种情况。

表 47.1. @BeanParam Injection Targets

目标资源代理生命周期

参数

All

字段

per-request (默认)

METHOD (字母属性)

per-request (默认)

without BeanParam 注解示例

以下示例演示了如何使用传统方法以 Java bean 格式获取表单数据(不使用 @BeanParam):

// Java
import javax.ws.rs.POST;
import javax.ws.rs.FormParam;
import javax.ws.rs.core.Response;
...
@POST
public Response orderTable(@FormParam("orderId")  String orderId,
                           @FormParam("color")    String color,
                           @FormParam("quantity") String quantity,
                           @FormParam("price")    String price)
{
    ...
    TableOrder bean = new TableOrder(orderId, color, quantity, price);
    ...
    return Response.ok().build();
}

在本例中,orderTable 方法可以处理一个表单,用于订购来自单一站点的表数量。发布完订购后,表单值将注入到 orderTable 方法的参数中,orderTable 方法明确使用注入的表格数据创建 TableOrder 类的实例。

带有 BeanParam 注解的示例

可以重构前面的示例,以利用 @BeanParam 注释。使用 @BeanParam 方法时,表单参数可以直接注入到 bean 类 表表 的字段。实际上,您可以使用 bean 类中的任何标准 JAX-RS 参数注释:包括 @PathParam@QueryParam@FormParam@MatrixParam@CookieParam@HeaderParam。可以按如下所示重构处理表单的代码:

// Java
import javax.ws.rs.POST;
import javax.ws.rs.FormParam;
import javax.ws.rs.core.Response;
...
public class TableOrder {
    @FormParam("orderId")
    private String orderId;

    @FormParam("color")
    private String color;

    @FormParam("quantity")
    private String quantity;

    @FormParam("price")
    private String price;

    // Define public getter/setter methods
    // (Not shown)
    ...
}
...
@POST
public Response orderTable(@BeanParam TableOrder orderBean)
{
    ...
    // Do whatever you like with the 'orderBean' bean
    ...
    return Response.ok().build();
}

现在,表单注解已添加到 bean 类 TableOrder 中,您可以使用单个 @BeanParam 注释替换资源方法签名中的所有 @FormParam 注解,如下所示。现在,当表单被发布到可 订购 的资源方法时,JAX-RS 运行时会自动创建 TableOrder 实例、orderBean 并在 bean 类上注入参数注解指定的所有数据。