Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate验证程序不计算消息中的EL表达式_Java_Hibernate_Hibernate Validator - Fatal编程技术网

Java Hibernate验证程序不计算消息中的EL表达式

Java Hibernate验证程序不计算消息中的EL表达式,java,hibernate,hibernate-validator,Java,Hibernate,Hibernate Validator,我写了一个关于Hibernate验证器的简单示例,参考官方文档 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 leas

我写了一个关于Hibernate验证器的简单示例,参考官方文档

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;
@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 );
}
下面是CarTest.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;
@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的验证消息是:“车牌“${validatedValue}”的长度必须介于2到14个字符之间。”

seatCount的验证消息是:“必须至少有2个座位${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>

org.hibernate
休眠验证器
4.3.1.最终版本
javax.el
javax.el-api
2.2.4
org.glassfish.web
javax.el
2.2.4

我不知道为什么它不起作用,有人能帮我吗?谢谢。

您使用的是Hibernate Validator 4.x版本,它与Bean Validation 1.0保持一致。在4.x版本中,使用表达式语言(EL)的变量插值不可用。这是添加到BeanValidation1.1中的一个特性,因此在HibernateValidator5.x系列中可用。最新的稳定版本是5.1.3.Final。我建议您升级到该版本。

在hibernate 4.3中,您需要指定ValueFormatTermMessageInterpolator作为消息插入器,而不是使用默认值,以便插入${validatedValue}:

Configuration<?> configuration = Validation.byDefaultProvider().configure();
ValidatorFactory factory = configuration
    .messageInterpolator(new ValueFormatterMessageInterpolator(configuration.getDefaultMessageInterpolator()))
    .buildValidatorFactory();

Validator validator = factory.getValidator();
Configuration-Configuration=Validation.byDefaultProvider().Configuration();
验证工厂=配置
.messageInterpolator(新值FormatTermMessageInterpolator(配置.getDefaultMessageInterpolator()))
.buildValidatorFactory();
Validator Validator=factory.getValidator();

我想你是从这里得到的吧?Dit从原始源代码树开始工作?请添加实体注释的导入。嗨,Peter,你能提供更多信息吗?