2016-11-16 137 views
0

我在Hibernate和Spring中使用Hibernate验证器,但似乎验证不起作用。当我不输入字符串或输入1个字符的字符串(不在min=4max=20之间)不显示任何错误并因此保存在表中。我错过了什么?Hibernate验证器不起作用

package dao; 

import java.util.Date; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 
import javax.persistence.Table; 
import javax.persistence.Temporal; 
import javax.persistence.TemporalType; 
import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Size; 

@Entity 
@Table(name="etudiant") 
public class Etudiant { 

    @Id 
    @Column(name="ID_ETUDIANT") 
    @GeneratedValue 
    private Long idEtudiant; 

    @Column(name="NOM") 
    @Size (min=4, max=20) 
    private String nom; 

    @Size(min=4, max=20, message="nom doit etre entre 4 et 20 svp..") 
    @Column(name="PRENOM") 
    private String prenom; 

    @Column(name="DATE_NAISSANCE") 
    @Temporal(TemporalType.DATE) 
    private Date dateNaissance; 

    @NotNull 
    @Column(name="EMAIL") 
    private String email; 

    public Etudiant() { 
     super(); 
    } 

    public Long getIdEtudiant() { 
     return idEtudiant; 
    } 

    public void setIdEtudiant(Long idEtudiant) { 
     this.idEtudiant = idEtudiant; 
    } 

    public Etudiant(String nom, String prenom, Date dateNaissance, String email) { 
     super(); 
     this.nom = nom; 
     this.prenom = prenom; 
     this.dateNaissance = dateNaissance; 
     this.email = email; 
    } 

    public String getNom() { 
     return nom; 
    } 

    public void setNom(String nom) { 
     this.nom = nom; 
    } 

    public String getPrenom() { 
     return prenom; 
    } 

    public void setPrenom(String prenom) { 
     this.prenom = prenom; 
    } 

    public Date getDateNaissance() { 
     return dateNaissance; 
    } 

    public void setDateNaissance(Date dateNaissance) { 
     this.dateNaissance = dateNaissance; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 
} 

控制器:

@RequestMapping(value="save",method=RequestMethod.POST) 
public String saveetudient(Model md, 
     @Valid @ModelAttribute("etudiant") Etudiant et, 
     BindingResult res) { 
    if (res.hasErrors()) { 
     List <Etudiant> ets=service.listeEtudiants(); 
     md.addAttribute("etudiants",ets); 
     return "etudiant1"; 
    } 
    else { 
     service.addEtudiant(et); 
     List <Etudiant> ets=service.listeEtudiants(); 
     md.addAttribute("etudiants",ets); 
     return "etudiant1"; 
    } 
} 

在JSP中我把这个线来显示错误:

<form action="save" method="post"> 

    <table border="1" width="500" bgcolor="grey"> 

<tr> 

<th>Nom </th> 
<th>Prenom </th> 
<th> Date de naissance</th> 
<th>Email </th> 
</tr> 


<tr> 
<td> <input type="text" name="nom" > </td> 
<td> <input type="text" name="prenom" > </td> 
<td> <input type="text" name="dateNaissance" > </td> 
    <td> <input type="text" name="email" > </td> 
</tr> 

</table> <br> 
<input type="submit" value="ajouter"> 

<sform:errors path="etudiant.*"/> 
<sform:errors path="prenom"/> 
</form> 

XML配置文件:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc.xsd "> 

<context:component-scan base-package="controller"/> 
<mvc:annotation-driven/> 

<bean class="dao.DaoEtudiantImpl" name="daoetud"></bean> 

<bean class="service.EtudiantMetierImpl" name="servetud"> 
    <property name="dao" ref="daoetud"></property> 
</bean> 
<mvc:resources mapping="/resources/**" location="/resources/" /> 

    <bean id="viewResolver"   
class="org.springframework.web.servlet.view.InternalResourceViewResolver" > 
<property name="prefix"> 
    <value>/WEB-INF/</value> 
</property> 
<property name="suffix"> 
    <value>.jsp</value> 

</property> 

+0

为什么要在场上和获得者? –

+0

对不起,我把它从吸气剂中拿走,我只是在尝试一些东西。刚刚更新 –

+0

我还没有用过一段时间的休眠。最小和最大真的是字符串长度还是数字? – Mukus

回答

0

最后我发现错误, 的问题是,我didin't添加休眠-验证罐子我只在dist/lib中添加的文件/要求:

  • 同学-1.3.1

  • javax.el-2.2.4 -javax.el-API-2.2.2

  • jboss-logging-3.3.0.Final

  • validation-api-1.1.0

    因此,如果发生某人只是添加:hibernate-validator-5.3.2.Final。

0

花了一小时后,研究两个验证教程:

Hibernate Validator Annotations Example

Spring MVC Form Validation Annotation Example

我建议你一些解决方案。

1)检查休眠的验证注解工作或没有

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();  
Validator validator = factory.getValidator(); 
Set<ConstraintViolation<Etudiant>> constraintViolations = validator.validate(etudiant); 

2)您可以创建自定义的验证,例如EtudiantValidator,然后验证像下面手动:

@RequestMapping(value="save",method=RequestMethod.POST) 
public String saveetudient(Model md,@ModelAttribute("etudiant") Etudiant etudiant, BindingResult res){ 
    new EtudiantValidator().validate(etudiant, result); 
    ... 
} 

不过,我深入到你的代码,我看到你在这个方法上有个错误:

@RequestMapping(value="save",method=RequestMethod.POST) 
public String saveetudient(Model md, 
     @Valid @ModelAttribute("etudiant") Etudiant et, 
     BindingResult res) 

应该改成它像下面那样

@RequestMapping(value="save",method=RequestMethod.POST) 
public String saveetudient(Model md, 
     @Valid @ModelAttribute("etudiant") Etudiant etudiant, 
     BindingResult res) 

希望这个帮助!

+0

谢谢你的建议。我改变了你的建议但不会改变。为了验证hibernate验证器注释是否正常工作,我不明白,请你给我更多关于如何做的细节。 –

+0

Validator注释正常工作,所以这个问题来自Spring端。让我们看看我链接的教程中的Spring东西 –