[英]Spring MVC form validation does't work for nested complex types
我正在實現一個帶有表單驗證的示例 Spring MVC 表單。 我有一個復雜類型的Address
作為Student
表單 bean 的 bean 屬性。 我為Address
bean 屬性添加了表單驗證@NotEmpty
。 但同樣沒有反映在 UI 中。 但是表單驗證適用於其他原始類型的Student
表單 bean。
因此,驗證非常適用於Student
表單 bean,但不適用於像Student
表單 bean 中的Address
這樣的嵌套復雜類型。
我正在嘗試了解原因和解決方法。
Spring 4.0+ 版本。 休眠驗證器 api:5.2.4
Student
POJO:
package com.xyz.form.beans;
import java.util.Date;
import java.util.List;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;
import com.xyz.validators.DateNotEmpty;
import com.xyz.validators.ListNotEmpty;
public class Student {
@Size(min = 2, max = 30)
private String firstName;
@Size(min = 2, max = 30)
private String lastName;
@NotEmpty
private String gender;
@DateNotEmpty
@Past
private Date DOB;
private String email;
private String mobileNumber;
@ListNotEmpty
private List<String> courses;
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getDOB() {
return DOB;
}
public void setDOB(Date dOB) {
DOB = dOB;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMobileNumber() {
return mobileNumber;
}
public void setMobileNumber(String mobileNumber) {
this.mobileNumber = mobileNumber;
}
public List<String> getCourses() {
return courses;
}
public void setCourses(List<String> courses) {
this.courses = courses;
}
}
Address
POJO:
package com.xyz.form.beans; import org.hibernate.validator.constraints.NotEmpty; import com.xyz.validators.LongNotEmpty; public class Address { @NotEmpty private String houseNo; @NotEmpty private String street; @NotEmpty private String area; @NotEmpty private String city; @LongNotEmpty private Long pin; public String getHouseNo() { return houseNo; } public void setHouseNo(String houseNo) { this.houseNo = houseNo; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getArea() { return area; } public void setArea(String area) { this.area = area; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public Long getPin() { return pin; } public void setPin(Long pin) { this.pin = pin; } }
Student
管理員:
@RequestMapping(value = "/newStudentDetails.do", method = RequestMethod.POST) public ModelAndView newStudentDetails( @Valid @ModelAttribute("student") com.xyz.form.beans.Student studentFormBean, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return new ModelAndView("newStudentPage"); } Student studentDto = new Student(); studentDto.setFirstName(studentFormBean.getFirstName()); studentDto.setLastName(studentFormBean.getLastName()); studentDto.setGender(studentFormBean.getGender()); studentDto.setDOB(new Date(studentFormBean.getDOB().getTime())); studentDto.setEmail(studentFormBean.getEmail()); studentDto.setMobileNumber(studentFormBean.getMobileNumber()); StringBuilder sb = new StringBuilder(); sb.append(studentFormBean.getAddress().getHouseNo() + ", "); sb.append(studentFormBean.getAddress().getStreet() + ", "); sb.append(studentFormBean.getAddress().getArea() + ", "); sb.append(studentFormBean.getAddress().getCity() + "-"); sb.append(studentFormBean.getAddress().getPin()); studentDto.setAddress(sb.toString()); studentDto.setCourses(studentFormBean.getCourses()); studentDao.createStudent(studentDto); ModelAndView mav = new ModelAndView("newStudentSuccess"); return mav; }
謝謝,維斯瓦納特
嗨,讓我們試試@ModelAttribute("student") @Valid com.xyz.form.beans.Student studentFormBean
代替@Valid @ModelAttribute("student")
對於嵌套復雜類型,您必須激活直接字段訪問。 就像下面一樣:
@org.springframework.web.bind.annotation.ControllerAdvice
public class ControllerAdvice {
@InitBinder
public void initBinder(WebDataBinder webDataBinder) {
webDataBinder.initDirectFieldAccess();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.