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(默认)

没有 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 方法处理了一个表单,用于排序来自 furniture 网站的表数量。当订购表单后,表单值将注入到 orderTable 方法的参数中,使用注入的表单数据显式创建 TableOrder 类的实例。

带有 BeanParam 注解的示例

上一示例可以重构为利用 @BeanParam 注释。使用 @BeanParam 方法时,表单参数可以直接注入到 bean 类的字段( TableOrder )。实际上,您可以使用 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 注释,如所示。现在,当表单发布到 orderTable 资源方法中时,JAX-RS 运行时会自动创建 TableOrder 实例,orderBean,并注入 bean 类上参数注解指定的所有数据。