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(默认) |
| 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 类上参数注解指定的所有数据。