簡體   English   中英

Spring MVC 表單驗證不適用於嵌套的復雜類型

[英]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;
        }

謝謝,維斯瓦納特

您需要使用@Valid 注釋您的復雜類型。 這是引用(引用在這里

嗨,讓我們試試@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM