2016-11-16 105 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東西 –