Bean Validation 1.1 已经发布了一段时间,与此同时,Java EE 7 平台规范也已经定稿。现在是时候深入了解这些更新对 Bean Validation 以及其参考实现 Hibernate Validator 5 的影响了。
在接下来的几周里,我们将通过一系列博客文章深入了解这些最激动人心的新特性,从今天开始,我们将从错误消息中表达式语言的使用开始。
摘要
许多用户只将 统一表达式语言 (EL) 与 JSF 和 JSP 相联系。但实际上,随着时间的发展,EL 已经成熟为一个拥有自己规范和诸如 Lambda 表达式等优秀功能的独立语言。它可以应用于任何应用层,无论是基于 Java EE 还是 Java SE 的应用。
Bean Validation 1.1 利用 EL 来提供围绕约束违反消息的高级功能,例如条件消息和可定制的消息格式化。
在约束消息中使用 EL 表达式
以下是一个例子,让我们看看内置的 @DecimalMax 约束。在 Bean Validation 1.1 中,这个约束有一个新的标志inclusive它指定给定的最大值是否包含。根据标志的值,约束的错误消息应该是 必须小于 {value} 或 必须小于或等于 {value}。
这种行为在 Bean Validation 1.0 中不容易实现,但使用 EL 表达式可以轻松实现,它条件性地添加了 或等于 部分
must be less than ${inclusive == true ? 'or equal to ' : ''}{value}"
EL 表达式的形式是${expression}。您可以使用它们来实现条件逻辑,如示例所示,执行计算,格式化值等。有关提供的功能和语法的更多信息,请参阅EL规范。
如示例中的{value}表达式所示,Bean Validation 1.0引用属性的语法仍得到支持,并优先于表达式评估。因此,例如,消息${amount}将被插入为类似$50的内容。
引用验证值
除了验证约束的所有属性(如inclusive)之外,您还可以使用名称validatedValue访问应用约束的值,如下例所示
@ValidCustomer( message = "Not a valid customer: ${validatedValue.getName()}" ) public class Customer { //... public String getName() { return name; } }
在此,违反@ValidCustomer约束将生成类似不是有效的客户:Bob
的消息。
进行一些格式化
最后,通过名称formatter公开了一个字符串格式化的辅助工具,它提供了一个var-args方法format(String format, Object... args)它与java.util.Formatter.format(String format, Object... args)的行为完全相同。如果您想以特殊方式格式化数字值,这将很有用
public class Order { @DecimalMin(value="20.00", message="Order value too low: € ${formatter.format('%08.2f', validatedValue)}") private final BigDecimal value; //... }
显示的格式表达式会在值前面填充前导零,因此如果违反了@DecimalMin约束,您将得到类似订单价值过低:€ 00017.89
的消息。
EL 和类路径
为了使用表达式语言功能,您需要在类路径上有一个EL实现。通常在运行Java EE容器(如WildFly)时是这样,但如果您的应用程序在纯Java SE环境中运行,则必须自己添加实现。Hibernate Validator已知与以下两个实现一起工作:EL 参考实现和JUEL。
最后,对所有Tomcat用户的一个特别提示。Hibernate Validator需要至少EL 2.2。这是Tomcat 7的一部分,因此您应该已经准备好了。但是Tomcat 6只包含EL 2.1实现。这意味着您就不能在Tomcat 6上体验所有Bean Validation 1.1的优点了吗?幸运的是并非如此,只需稍作准备即可。请查看Hibernate Validator FAQ,了解如何更新 Tomcat EL库。
亲自尝试
如果您想尝试表达式语言功能,只需从这里获取最新的Hibernate Validator版本。如果您使用Maven、Gradle或类似工具,您可以使用其GAV坐标org.hibernate.hibernate-validator.5.0.1.Final将其拉入项目中。如果您喜欢冒险并喜欢玩最新的代码,您甚至可以从其源代码中构建自己的WildFly。它最近更新到了Hibernate Validator 5。