【问题标题】:JPA, Hibernate validators - email validator not applying on StringJPA,Hibernate 验证器 - 电子邮件验证器不适用于字符串
【发布时间】:2018-04-28 21:42:53
【问题描述】:

我正在尝试弄清楚如何在我的控制器中验证 DTO

堆栈: Spring Boot 1.5.4、Spring Data JPA、Hibernate Validation 5、PostgreSQL

问题是我仍然收到关于缺少验证器的异常。

有什么线索吗?

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.Email' validating type 'java.lang.String'. Check configuration for 'email'
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.throwExceptionForNullValidator(ConstraintTree.java:227) ~[hibernate-validator-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorNoUnwrapping(ConstraintTree.java:308) ~[hibernate-validator-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getConstraintValidatorInstanceForAutomaticUnwrapping(ConstraintTree.java:242) ~[hibernate-validator-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.getInitializedConstraintValidator(ConstraintTree.java:163) ~[hibernate-validator-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:116) ~[hibernate-validator-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints(ConstraintTree.java:87) ~[hibernate-validator-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint(MetaConstraint.java:73) ~[hibernate-validator-5.4.1.Final.jar:5.4.1.Final]
    at org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint(ValidatorImpl.java:616) ~[hibernate-validator-5.4.1.Final.jar:5.4.1.Final]

DTO

public class CreateUserDto {

    @NotEmpty
    private String name;

    @Email
    @NotEmpty
    private String email;

    private String password;

    private String address;

    private String phone;

    @NotNull
    private Role role;
}

控制器

@PostMapping(value = "/users", consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public UserDto register(@Valid @RequestBody CreateUserDto user) {
    return userService.register(user);
}

【问题讨论】:

    标签: spring-data-jpa bean-validation hibernate-validator


    【解决方案1】:

    我怀疑您正在使用 Bean Validation 2.0 和仅支持 BV 1.1 的 Hibernate Validator 5.4。 @Email 约束被添加到 2.0 的规范中 - 在此之前,它只是一个 HV 特定的约束。

    您可能向 validation-api 2.0 添加了依赖项。

    所以:

    • 要么返回 BV 1.1,要么需要使用 Hibernate Validator 特定的 @Email 约束(来自包 org.hibernate.validator.constraints);
    • 或者您将 HV 升级到 6.0(推荐)并保留 BV 2.0 和 javax.validation @Email 约束。

    【讨论】:

    • 我已将 HV 升级到 6.0,现在可以使用了,谢谢
    • 我有 HV 6.0.5 和 BV 2.0 并收到错误:javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.Email' 验证类型 'java .lang.String'.
    • 您确定在类路径中没有 HV 5.x 吗?如果没有,请尝试使用我们的测试用例模板 (github.com/hibernate/hibernate-test-case-templates/tree/master/…) 重现它,并在我们的问题跟踪器上发布:hibernate.atlassian.net。谢谢。
    【解决方案2】:

    这是由于 Bean Validation 和 Hibernate Validator 之间的版本不匹配造成的。

    您只需将 Hibernate 验证升级到最新版本。

    Maven

    <dependency>
       <groupId>org.hibernate</groupId>
       <artifactId>hibernate-validator</artifactId>
       <version>6.0.11.Final</version>
    </dependency>
    

    分级

    compile group: 'org.hibernate', name: 'hibernate-validator', version: '6.0.10.Final'
    

    【讨论】:

      猜你喜欢
      • 2015-02-24
      • 1970-01-01
      • 2016-01-15
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 2018-10-23
      相关资源
      最近更新 更多