【问题标题】:Hibernate validation error - @Size休眠验证错误 - @Size
【发布时间】:2014-01-17 09:15:18
【问题描述】:

我有 User 实体,我尝试在测试中验证字段 password 的长度。

我的用户类:

public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "email", length = 100, nullable = false, unique = true)
    @NotEmpty
    @Email
    private String email;

    @Column(name = "password")
    @NotEmpty
    @Size(min = 5, max = 6)
    private String password;
}

我尝试了 3 种变体。

1.当密码长度

@Test
public void passwordIsShort() {
    User user = new User();
    user.setPassword("1");

    Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "password");

    assertEquals(1, constraintViolations.size());
}

此测试不起作用并显示错误。

2.当密码长度在5和6之间时

@Test
public void passwordIsShort() {
    User user = new User();
    user.setPassword("12345");

    Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "password");

    assertEquals(0, constraintViolations.size());
}

这个测试是正确的。

3.当密码长度> 6时

@Test
public void passwordIsShort() {
    User user = new User();
    user.setPassword("1234567");

    Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "password");

    assertEquals(1, constraintViolations.size());
}

此测试不起作用并显示错误

错误:

java.lang.NoSuchMethodError: javax.el.ExpressionFactory.newInstance()Ljavax/el/ExpressionFactory;
at org.hibernate.validator.internal.engine.messageinterpolation.InterpolationTerm.<clinit>(InterpolationTerm.java:60)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateExpression(ResourceBundleMessageInterpolator.java:227)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolateMessage(ResourceBundleMessageInterpolator.java:187)
at org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator.interpolate(ResourceBundleMessageInterpolator.java:115)
at org.hibernate.validator.internal.engine.ValidationContext.interpolate(ValidationContext.java:370)
at org.hibernate.validator.internal.engine.ValidationContext.createConstraintViolation(ValidationContext.java:284)
at org.hibernate.validator.internal.engine.ValidationContext.createConstraintViolations(ValidationContext.java:246)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint(ConstraintTree.java:289)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:133)
at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:91)
at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:85)
at org.hibernate.validator.internal.engine.ValidatorImpl.validatePropertyForDefaultGroup(ValidatorImpl.java:855)
at org.hibernate.validator.internal.engine.ValidatorImpl.validatePropertyForCurrentGroup(ValidatorImpl.java:768)
at org.hibernate.validator.internal.engine.ValidatorImpl.validatePropertyInContext(ValidatorImpl.java:670)
at org.hibernate.validator.internal.engine.ValidatorImpl.validateProperty(ValidatorImpl.java:169)
at ru.yadoka.user.UserClass.passwordIsShort(UserClass.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:24)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:202)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:65)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

UPD

我用

java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) Client VM (build 24.51-b03, mixed mode, sharing)

【问题讨论】:

  • 约束看起来正确。测试结果如何?根本没有ConstraintViolation?有什么例外吗?如果你使用 Validator.validate(user) 会怎样? validateProperty 当然也应该可以工作,但它可能有助于缩小问题范围。
  • 我已经编辑了我的问题并添加了一些我尝试过的案例。我也试过 Validator.validate(user) 结果是一样的。

标签: validation hibernate-validator


【解决方案1】:

我很惊讶任何测试都能奏效。您的异常表明您的类路径上的统一表达式语言依赖项版本错误。另见https://github.com/hibernate/hibernate-validatorhttp://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#validator-gettingstarted-uel

我想问题在于您在哪个环境中运行以及您正在使用哪些 EL 依赖项(如果有)。

【讨论】:

  • 我添加了EL依赖,没有结果。然后我尝试添加消息参数@Size(min = 5, max = 6, message = "size must be between 5 and 6") private String password;,它可以正常工作。它也可以在没有 EL 依赖的情况下正常工作。
【解决方案2】:

我意识到这篇文章有点老了,可能已经解决了。如果其他人遇到同样的问题,无论如何都想更新。 正如 Mufanu 在评论中添加的那样,如果我们 在注释中添加消息属性

,这将解决

@not null 没有消息也能正常工作

@Size(min = 5, max = 6, message = "大小必须在 5 到 6 之间")
私有字符串密码;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2018-05-01
    • 2016-03-24
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多