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。

最近更新的参考指南包含了您所需的所有信息,我们很高兴在论坛中回答您的问题。


返回顶部