2017-10-28 125 views
1

我試圖驗證這個bean:與Spring和Hibernate的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); 

    } 
} 
+0

如果你有一個messages.properties,並且在它內部有一個鍵「javax.validation.constraints.Email」,你看了你的項目(或者在spring/hibernate驗證jar裏面),因爲這是錯誤所抱怨的 –

+0

不,在message.properties文件中沒有這樣的密鑰。手動添加它並沒有幫助。 – ariiiiiii

+0

您能否提供額外的代碼和/或配置(例如最小的'pom.xml')以便更容易地重現您的問題?我之前使用過bean驗證,但在完整的Spring + Jersey Web應用程序中。如果可能,我想用比這更少的努力重現您的問題。 :) –

回答

0

基於對https://stackoverflow.com/a/17086477/1840078讀我猜測,這個問題是多餘的,可能與衝突的bean驗證註釋有衝突。當出現@Email註釋時,@NotBlank註釋是多餘的,機會是@Length註解也是多餘的。有效的電子郵件地址不能爲空,並且對於具有頂級域名的電子郵件主機,其全限定主機名的長度必須至少爲5。

+1

我試着只留下@Email註釋。不幸的是,這並沒有解決問題。 – ariiiiiii