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” 中总结了这种情况。
目标 | 资源代理生命周期 |
---|---|
| All |
| per-request (默认) |
| 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 类上注入参数注解指定的所有数据。