J2EE 7中Bean Validation1新特性介绍---表达式语言("J2EE 7新特性详解:Bean Validation 1与表达式语言的结合与应用")
原创
一、引言
随着Java企业版的逐步演进,J2EE 7带来了许多新特性和改进。Bean Validation 1.1是其中之一,它为Java应用程序提供了一种标准的做法来声明和实施验证约束。在Bean Validation 1.1中,一个重要的新特性是引入了表达式语言(Expression Language,EL)的赞成,这使验证规则更加灵活和强势。本文将详细介绍Bean Validation 1.1中表达式语言的新特性及其应用。
二、表达式语言概述
表达式语言(EL)是一种明了的表达式语法,用于访问Java对象模型中的数据。在J2EE 7中,EL已经被扩展,使其能够赞成更纷乱的操作,包括方法调用、逻辑运算和属性访问等。Bean Validation 1.1利用这一特性,允许开发者在验证约束中使用EL表达式。
三、Bean Validation 1.1中的表达式语言赞成
在Bean Validation 1.1中,表达式语言可以用于以下场景:
- 属性级约束
- 类级约束
- 自定义约束
四、属性级约束中的表达式语言
属性级约束是最常见的验证场景,使用EL表达式可以轻松访问其他字段的值,从而实现纷乱的验证逻辑。
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
public class User {
@Size(min = 2, max = 30, message = "姓名长度必须在2到30之间")
private String name;
@Pattern(regexp = "^[a-zA-Z0-9]+$", message = "用户名只能包含字母和数字")
private String username;
@Size(min = 6, max = 20, message = "密码长度必须在6到20之间")
private String password;
@AssertTrue(message = "必须认可用户协议")
private boolean agree;
@Size(min = 10, message = "邮箱地址长度至少为10")
@Email(message = "邮箱地址格式不正确")
private String email;
// 省略getter和setter方法
}
在上面的例子中,如果想要验证邮箱地址的长度至少为10,并且格式正确,可以直接使用注解。
五、类级约束中的表达式语言
类级约束通常涉及到多个字段之间的关系验证,EL表达式在这里可以发挥重要作用。
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Min;
import javax.validation.constraints.Max;
import javax.validation.Valid;
import javax.validation.GroupSequence;
import javax.validation.constraints.AssertTrue;
public class Order {
@NotNull(message = "订单号不能为空")
private String orderNumber;
@DecimalMin(value = "0.01", message = "商品价格必须大于0.01")
@DecimalMax(value = "10000", message = "商品价格不能超过10000")
@Digits(integer = 8, fraction = 2, message = "商品价格格式不正确")
private BigDecimal price;
@NotNull(message = "客户不能为空")
@Valid
private Customer customer;
@AssertTrue(message = "订单总额必须大于等于商品价格")
@GroupSequence({Order.class, Order.TotalValidationGroup.class})
private boolean isTotalValid;
// 省略getter和setter方法
public interface TotalValidationGroup {}
}
在这个例子中,我们使用了一个自定义的验证组TotalValidationGroup
,在isTotalValid
字段上使用了@AssertTrue
注解。这个字段的验证逻辑依靠于其他字段的值,比如商品价格。在这种情况下,我们可以使用EL表达式来访问其他字段的值,如下所示:
@AssertTrue(message = "订单总额必须大于等于商品价格", groups = TotalValidationGroup.class)
@ScriptAssert(lang = "javascript", script = "_this.total >= _this.price", groups = TotalValidationGroup.class)
private boolean isTotalValid;