Hibernate Validator 不评估消息中的 EL 表达式
Hibernate Validator does not evaluate EL expression in message
我写了一个关于Hibernate Validator的简单例子参考官方文档。
Car.java的代码片段如下:
@Size(min = 2, max = 14, message = "The license plate '${validatedValue}' must be between {min} and {max} characters long")
private String licensePlate;
@Min(value = 2, message = "There must be at least {value} seat${value > 1 ? 's' : ''}")
private int seatCount;
@DecimalMax(value = "350", message = "The top speed ${formatter.format('%1$.2f', validatedValue)} is higher "
+ "than {value}")
private double topSpeed;
CarTest.java的代码片段如下:
@Test
public void licensePlateTest()
{
Car car = new Car( null, "A", 1, 400.123456, BigDecimal.valueOf( 200000 ) );
String message = validator.validateProperty( car, "licensePlate" )
.iterator()
.next()
.getMessage();
assertEquals(
"The license plate must be between 2 and 14 characters long",
message
);
}
@Test
public void seatCountTest()
{
Car car = new Car( null, "A", 1, 400.123456, BigDecimal.valueOf( 200000 ) );
String message = validator.validateProperty( car, "seatCount" ).iterator().next().getMessage();
assertEquals( "There must be at least 2 seats", message );
}
licensePlate的验证信息是:"The license plate '${validatedValue}' must be between 2 and 14 characters long."
seatCount的验证信息是:"There must be at least 2 seat${value > 1 ? 's' : ''}."
我们可以看到,EL 表达式不起作用。关于我的项目的 pom.xml 是:
<!-- Hibernate Validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.4</version>
</dependency>
我不知道为什么它不起作用,有人可以帮助我吗?谢谢
您正在使用与 Bean Validation 1.0 一致的 Hibernate Validator 4.x 版本。在 4.x 版本中,使用表达式语言 (EL) 的变量插值不可用。这是添加到 Bean Validation 1.1 的功能,因此在 Hibernate Validator 5.x 系列中可用。最新的稳定版本是5.1.3.Final。我建议你升级到那个版本。
在 hibernate 4.3 中,您需要将 ValueFormatterMessageInterpolator 指定为消息插值器,而不是使用默认值来插值 ${validatedValue}:
Configuration<?> configuration = Validation.byDefaultProvider().configure();
ValidatorFactory factory = configuration
.messageInterpolator(new ValueFormatterMessageInterpolator(configuration.getDefaultMessageInterpolator()))
.buildValidatorFactory();
Validator validator = factory.getValidator();
我写了一个关于Hibernate Validator的简单例子参考官方文档。
Car.java的代码片段如下:
@Size(min = 2, max = 14, message = "The license plate '${validatedValue}' must be between {min} and {max} characters long")
private String licensePlate;
@Min(value = 2, message = "There must be at least {value} seat${value > 1 ? 's' : ''}")
private int seatCount;
@DecimalMax(value = "350", message = "The top speed ${formatter.format('%1$.2f', validatedValue)} is higher "
+ "than {value}")
private double topSpeed;
CarTest.java的代码片段如下:
@Test
public void licensePlateTest()
{
Car car = new Car( null, "A", 1, 400.123456, BigDecimal.valueOf( 200000 ) );
String message = validator.validateProperty( car, "licensePlate" )
.iterator()
.next()
.getMessage();
assertEquals(
"The license plate must be between 2 and 14 characters long",
message
);
}
@Test
public void seatCountTest()
{
Car car = new Car( null, "A", 1, 400.123456, BigDecimal.valueOf( 200000 ) );
String message = validator.validateProperty( car, "seatCount" ).iterator().next().getMessage();
assertEquals( "There must be at least 2 seats", message );
}
licensePlate的验证信息是:"The license plate '${validatedValue}' must be between 2 and 14 characters long."
seatCount的验证信息是:"There must be at least 2 seat${value > 1 ? 's' : ''}."
我们可以看到,EL 表达式不起作用。关于我的项目的 pom.xml 是:
<!-- Hibernate Validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.3.1.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.4</version>
</dependency>
我不知道为什么它不起作用,有人可以帮助我吗?谢谢
您正在使用与 Bean Validation 1.0 一致的 Hibernate Validator 4.x 版本。在 4.x 版本中,使用表达式语言 (EL) 的变量插值不可用。这是添加到 Bean Validation 1.1 的功能,因此在 Hibernate Validator 5.x 系列中可用。最新的稳定版本是5.1.3.Final。我建议你升级到那个版本。
在 hibernate 4.3 中,您需要将 ValueFormatterMessageInterpolator 指定为消息插值器,而不是使用默认值来插值 ${validatedValue}:
Configuration<?> configuration = Validation.byDefaultProvider().configure();
ValidatorFactory factory = configuration
.messageInterpolator(new ValueFormatterMessageInterpolator(configuration.getDefaultMessageInterpolator()))
.buildValidatorFactory();
Validator validator = factory.getValidator();