J2EE 7中的Bean Validation 1.1正式发布很久了了。与此同时,Jave EE 7平台的最终标准也一定制定了。下面小编为大家整理了关于J2EE 7中Bean Validation1.1的新特性,希望能为你提供帮助:
现在,是时候去了解下我们能从这次BeanValidation的版本更新中得到什么新的特性以及了解其参考实现Hibernate Validator 5的新功能。在本文中,将简要向开发者介绍J2EE7中Bean Validation 1.1新特性――表达式语言。首先要了解下Bean Validation标准。所谓的Bean Validation,就是JavaEE 提出的使用注解的方式对Java Bean 进行约束验证的规范。目前最新的BeanValidation 1.1标准请参考(http://beanvalidation.org/1.1/)。在最新的1.1规范中,引入了类似JSP中的表达式语言(EL,标准请参考http://jcp.org/en/jsr/detail?id=341)。要知道,EL其实的应用场合是很广的,特别是一些很好的用法如Lambda表达式等都有很大用处,而且能用在J2SE或J2EE中。在Bean Validation 1.1中,开发者可以充分利用EL表达式中的强大的功能去做一些条件的判断以及实现一些自定义输出。
使用EL表达式限制值作为例子,首先来看下其内置的@DecimalMax约束。在BeanValidation 1.1中,该约束增加了一个新的标志位名为inclusiv,它表示约束中是否包含或不包含给定的最大值。根据该标志位,约束限制的信息或者是小于给定的值{value}或者是等于给定的值{value}。这样的用法BeanValidation 1.0中是比较难实现的,但在1.1中缺很容易实现,下面是一个典型的例子:
must be less than ${inclusive == true ? 'or equal to '> : ''}{value}"
这里,假设 value赋值为50的话,则假如@DecimalMax 中设置了inclusive属性为true,则输出:
must be less than or equal to 50;如果设置为false,则输出must be less than 50。
validatedValue特性
在Bean validation 1.1中,还可以在bean的约束属性中,设计当某个bean违反了某个约束规则后,显示所违反规则的真实的值,如下面的例子:
@ValidCustomer( message = "Not a valid customer: ${validatedValue.getName()}" ) public class Customer { //... public String getName() { return name; } }
在这个例子中,当这个bean违反了@ValidCustomer这个约束后,则会显示出:“Not a valid customer: Bob”这样的提示信息。也就是说,通过使用注解${validatedValue.getName(),获得了违反规定的输入的值Bob,这里是通过反射机制通过getName()方法获得的。新的格式化功能 最后,在Bean validation 1.1中,在格式化显示字符串方面提供了工具助手类formatter,其使用格式为:format(String format, Object... args),这个跟Java语言中的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; //... }
如果输入的数字小于20,则会输出:Order value too low: € 00017.89,这里是取了两位小数。
EL和Classpath
为了充分利用EL表达式,必须在classpath中放置EL的实现jar包。当在如WildFly等JavaEE容器中运行的时候通常会遇到点问题,开发者也需要在普通的JavaSE环境中增加EL的实现jar包。两种目前能和HibernateValidator工作良好的实现是EL的参考实现和JUEL。而对于使用Tomcat的用户,HiberateValidator至少需要的是EL 2.2标准,这个在Tomcat7中已经实现了。而Tomcat 6则只能和EL2.1的实现搭配使用。这个是否意味着Tomcat 6就不能享用EL的新功能?幸运的是,只需要额外的一些准备工作,可以通过查看HibernateValidator FAQ去学习如何更新Tomcat的EL类库。亲自动手如果要体验最新的Bean validation 1.1的特性,可以从这里链接获得最新的Hibernate Validator。如果使用的是Maven,Gradle等构建工具,则可以使用org.hibernate.hibernate-validator.5.0.1.Final的坐标进行查找。