【问题标题】:Bean validation with Spring and Hibernate doesn't work使用 Spring 和 Hibernate 进行 Bean 验证不起作用
【发布时间】:2018-04-10 05:05:30
【问题描述】:

我正在尝试验证这个 bean:

public class NewUserCompanyForm implements Serializable {
private static final long serialVersionUID = 6414340627544822204L;

@Email(groups = ValidationGroup1.class)
@NotBlank(groups = ValidationGroup1.class)
@Length(min = 5)
private String userName;

@NotBlank(groups = ValidationGroup1.class)
private String password;

@NotBlank(groups = ValidationGroup1.class)
private String repeatedPassword;

@NotBlank(groups = ValidationGroup2.class)
private String companyName;

@Pattern(regexp = "\\d\\d-\\d\\d\\d", groups = ValidationGroup2.class)
private String postalCode;

@NotBlank(groups = ValidationGroup2.class)
@Pattern(regexp = "\\p{L}*", groups = ValidationGroup2.class)
private String city;

@Pattern(regexp = "[-A-Za-z0-9 ,.]*", groups = ValidationGroup2.class)
@NotBlank(groups = ValidationGroup2.class)
private String addressDetails;

不幸的是,几乎所有字段验证都出现异常:

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.Email' validating type 'java.lang.String'. Check configuration for 'userName'

总是UnexpectedTypeException: HV000030。我阅读了 Hibernate 和 Spring 验证的文档,一切似乎都很好,因为例如@Email 注解可以和字符串一起使用。

编辑:添加 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <thymeleaf.spring.version>3.0.7.RC1</thymeleaf.spring.version>
    <thymeleaf.version>3.0.7.RELEASE</thymeleaf.version>
    <hibernate.validation.version>6.0.2.Final</hibernate.validation.version>
    <hibernate.version>5.2.11.Final</hibernate.version>
    <hibernate.commons.version>5.0.1.Final</hibernate.commons.version>
    <bean.validation.api.version>2.0.0.Final</bean.validation.api.version>
    <mysql.connector.java.version>6.0.6</mysql.connector.java.version>
    <spring.version>5.0.0.RELEASE</spring.version>
    <spring.session.version>1.3.1.RELEASE</spring.session.version>
    <spring.security.version>4.2.3.RELEASE</spring.security.version>
    <spring.webflow.version>2.4.6.RELEASE</spring.webflow.version>
    <spring.boot.test.version>2.0.0.M5</spring.boot.test.version>
    <common.codecs>1.10</common.codecs>
</properties>

<groupId>pwr.groupproject.vouchers</groupId>
<artifactId>voucherApp</artifactId>
<version>1.0-SNAPSHOT</version>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.7.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session</artifactId>
        <version>${spring.session.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf-spring5 -->
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring5</artifactId>
        <version>${thymeleaf.spring.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>${hibernate.validation.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>${bean.validation.api.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.connector.java.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf -->
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf</artifactId>
        <version>${thymeleaf.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api -->
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>${spring.security.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1-api</artifactId>
        <version>1.0.0.Final</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.hibernate.common/hibernate-commons-annotations -->
    <dependency>
        <groupId>org.hibernate.common</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>${hibernate.commons.version}</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>${common.codecs}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.webflow</groupId>
        <artifactId>spring-webflow</artifactId>
        <version>${spring.webflow.version}</version>
    </dependency>
</dependencies>
<repositories>
</repositories>

这是用于测试验证的类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {SpringWebFlowConfiguration.class, WebConfiguration.class})
public class NewUserCompanyFormValidationTest {
    @Autowired
    @Qualifier("localValidatorFactoryBean")
    private LocalValidatorFactoryBean validator;
    @Autowired
    private MessageSource messageSource;

    @Test
    public void DependencyInjectionTest(){
        Assert.assertNotNull(validator);
    }

    @Test
    public void NewUserCompanyFormValidatingTest(){
        NewUserCompanyForm form1=new NewUserCompanyForm();
        form1.setPassword("");
        form1.setUserName("");
        form1.setRepeatedPassword("");
        Set<ConstraintViolation<NewUserCompanyForm>> volations1=validator.validate(form1,NewUserCompanyForm.ValidationGroup1.class);

    }
}

【问题讨论】:

  • 如果你有一个messages.properties并且里面有一个键“javax.validation.constraints.Email”,你有没有看过你的项目(或spring/hibernate验证jar),因为那是什么错误在抱怨
  • 不,message.properties 文件中没有这样的键。手动添加它没有帮助。
  • 您能否提供额外的代码和/或配置(例如最小的pom.xml),以便更容易重现您的问题?我以前使用过 bean 验证,但在一个完整的 Spring + Jersey Web 应用程序中。如果可能的话,我想以更少的努力重现您的问题。 :)
  • 感谢pom.xml。您能否提供使用NewCompanyUserForm 并对其进行验证的代码?我将尝试(稍后 - 现在出发)使用类似于本周末晚些时候在 baeldung.com/javax-validation 所做的事情对 NewCompanyUserForm 进行编程验证。
  • 你能显示这个类的代码ValidationGroup1 吗?

标签: java spring hibernate validation spring-mvc


【解决方案1】:

看看这个...

@Email 注释没有@Constraint(第 36 行)

@Constraint(validatedBy = { })

在validation-api-2.0.1.Final中,所以最终结果是javax.servlet.ServletException: HV000030: No validator could be found for constraint 'javax.validation.constraints.Email'

【讨论】:

    【解决方案2】:

    基于对https://stackoverflow.com/a/17086477/1840078 的阅读,我推测该问题是多余的,并且可能与 bean 验证注释冲突。当存在@Email 注释时,@NotBlank 注释是多余的,@Length 注释也可能是多余的。有效的电子邮件地址不能为空,并且对于在其完全限定主机名中具有顶级域的电子邮件主机,其长度必须至少为 5。

    【讨论】:

    • 我试着只留下一个@Email 注释。不幸的是,它并没有解决问题。
    猜你喜欢
    • 2014-04-11
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2020-09-25
    • 2015-10-17
    • 2011-10-29
    • 2017-11-24
    • 2016-09-12
    相关资源
    最近更新 更多