Hibernate验证器不起作用
我在Hibernate和Spring中使用Hibernate验证器,但似乎验证不起作用。当我不输入字符串或输入1个字符的字符串(不在min=4
和max=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>
最后我发现错误, 的问题是,我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。
花了一小时后,研究两个验证教程:
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)
希望这个帮助!
谢谢你的建议。我改变了你的建议但不会改变。为了验证hibernate验证器注释是否正常工作,我不明白,请你给我更多关于如何做的细节。 –
Validator注释正常工作,所以这个问题来自Spring端。让我们看看我链接的教程中的Spring东西 –
为什么要在场上和获得者? –
对不起,我把它从吸气剂中拿走,我只是在尝试一些东西。刚刚更新 –
我还没有用过一段时间的休眠。最小和最大真的是字符串长度还是数字? – Mukus