【发布时间】:2013-11-27 17:07:06
【问题描述】:
我正在做一个项目,并且我已经使用 Hibernate Validator 有一段时间了。 最近我尝试在验证消息中使用Interpolation with message expressions(具有 EL 功能),但我得到的结果不一致(据我所知)。
根据有关消息插值步骤的文档,消息参数(包含在“{..}”中的参数)在评估消息表达式(包含在“${..}”中的参数)之前解析。因此,我的结论是允许写这样的消息:
${validatedValue > someValue ? '{x.y.z.message}' : '{x.y.w.message}'}
并期望其键为x.y.z.message 或x.y.w.message 的消息文字是结果,其中x.y.z.message 和x.y.w.message 被假定为有效且已在正确引导的资源中定义的消息键捆绑。
为了澄清问题,我使用 TestNG 编写了一个测试用例,并针对 hibernate-validator-5.0.1.Final 和 hibernate-validator-5.1.0-Alpha 运行它。正如在测试 cmets 中指出的那样,这些版本获得的结果在这个特定问题上会有所不同,这暗示了我对实现错误的看法。我最初认为这可能与[HV-798] 有关,但似乎更深层次。
这是测试用例:
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import javax.validation.constraints.Size;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
public class HibernateValidationTest
{
public class Entity
{
public int caseIndex;
@Size(min = 4, max = 10, message = "${validatedValue.length() < min ? 'Error msg.#1' : 'Error msg.#2'}")
public String getMessage1()
{
if (caseIndex == 0)
return "abc";
return "abcd";
}
@Size(min = 4, max = 10, message = "{javax.validation.constraints.Size.message}")
public String getMessage2()
{
if (caseIndex == 1)
return "abc";
return "abcd";
}
@Size(min = 4, max = 10, message = "{javax.validation.constraints.Size.message} (${validatedValue.length() < min ? 'Error msg.#3' : '{javax.validation.constraints.Size.message}'})")
public String getMessage3()
{
if (caseIndex == 2)
return "abc";
return "abcd";
}
}
@Test
public void testValidatorBug()
{
Validator validator = javax.validation.Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<Entity>> violations;
ConstraintViolation<Entity> violation;
Entity entity = new Entity();
/**
* PASS
*/
entity.caseIndex = 0;
violations = validator.validate(entity);
assertEquals(violations.size(), 1);
violation = violations.iterator().next();
assertEquals(violation.getMessage(), "Error msg.#1");
/**
* PASS
*/
entity.caseIndex = 1;
violations = validator.validate(entity);
assertEquals(violations.size(), 1);
violation = violations.iterator().next();
assertEquals(violation.getMessage(), "size must be between 4 and 10");
/**
* FAIL
*
* Violation message:
*
* - on version hibernate-validator-5.0.1.Final:
* size must be between 4 and 10 (${validatedValue.length() < min ? 'Error msg.#3' : '{javax.validation.constraints.Size.message}'})
*
* - on hibernate-validator-5.1.0-20131114.015215-37:
* {javax.validation.constraints.Size.message} (${validatedValue.length() < min ? 'Error msg.#3' : '{javax.validation.constraints.Size.message}'})
*/
entity.caseIndex = 2;
violations = validator.validate(entity);
assertEquals(violations.size(), 1);
violation = violations.iterator().next();
assertEquals(violation.getMessage(), "size must be between 4 and 10 (Error msg.#3)");
}
}
在此测试中,Entity.getMessage3() 演示了测试最后一部分发现的问题。根据我的理解,这条消息一定是size must be between 4 and 10 (Error msg.#3),但在5.0.1版本上是size must be between 4 and 10 (${validatedValue.length() < min ? 'Error msg.#3' : '{javax.validation.constraints.Size.message}'}),并且
5.1.0.Alpha 上的{javax.validation.constraints.Size.message} (${validatedValue.length() < min ? 'Error msg.#3' : '{javax.validation.constraints.Size.message}'})。
任何人都可以对此进行评估并提出问题或帮助我找出自己的错误。
感谢您的宝贵时间。
【问题讨论】:
标签: java expression message bean-validation hibernate-validator