当前位置: 首页 > 知识库问答 >
问题:

Spring MVC表单验证对嵌套的复杂类型不起作用

都阳
2023-03-14

我正在实现一个带有表单验证的示例Spring MVC表单。我有一个复杂类型address作为student表单bean的bean属性。并且我为addressbean属性添加了表单验证@notempty。但在UI中并没有体现出同样的情况。但是表单验证也适用于student表单bean的其他基元类型。

因此,验证对于student表单bean非常有效,但对于嵌套的复杂类型(如student表单bean中的address)则不适用。

我正在试着了解原因和解决办法。

Spring版本4.0+。Hibernate验证器API:5.2.4

学生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;
    }
}

    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;
        }
    }



    @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;
        }

谢谢,维斯瓦纳特

共有1个答案

郑鸿朗
2023-03-14

您需要用@valid注释复杂类型。这是引用(这里引用)

 类似资料:
  • 目前我正在使用javax。xml。验证。验证程序根据给定的xsd验证xml。我已经将自定义错误处理程序设置为获取所有异常,而不是在第一个异常时退出。 我如何才能实现这一点?

  • 我正在按照本指南使用Spring表单验证,但我无法在自己的程序中验证表单。我完全按照指南中的描述去做,但在我的应用程序中却不起作用。 我使用Spring Tools Suite并下载了示例应用程序,以查看它是否真的可以工作。我看不出究竟是什么原因导致表单验证发生在示例应用程序中而不是我的应用程序中。我试图通过从POM中移除依赖项来缓慢地更改示例应用程序,以使其中断,但它继续工作.....到底是哪个

  • 我想要实现的是: 验证bean支持的表单,例如使用以下类 所以,“名字”和“兴趣”来自网络表单。“name”有一些约束(NotNull),使用@Valid可以完成它应该做的事情。 “兴趣”是兴趣ID的列表。 在对“名称”进行初始验证后,我填写列表集合。 之后我想验证这个结构。“@CustomValidInterest”是一个自定义验证注释。我可以使用验证组进行两阶段验证。 问题是,如果某个“兴趣”

  • 这里是我的pom.xml 4.0.0 org.springframework.Boot spring-boot-starter-parent 2.3.2.release com.king Gestpeacesecurity 0.0.1-snapshot Gestpeacesecurity用于Spring Boot的和平安全项目 我的实体代理,我使用lomback作为getter和setter 这是

  • 我试图通过将请求参数直接绑定到用户实体来简化我的代码,而不是一个字段一个字段地复制值,但是我似乎不能通过这种方式得到验证。 控制器: 验证器: 模型(注意嵌套对象用@Valid标注): 问题是只有密码和重新密码字段被正确验证,用户类中的验证注释被忽略,任何密码匹配的请求都通过,但它应该会出现错误。空密码或不同的密码会按预期出现错误。

  • 问题内容: 如何跳过使用AngularJS验证嵌套表单的方法?即使子窗体无效,我也必须使其外部窗体有效。 在下面的示例中,外部格式应该有效(必须为true)。默认情况下不是。有选择吗? 代码(jsFiddle): 问题答案: 在Angular形式中可以嵌套。这意味着外部形式在所有子形式都有效时也有效。 因此,当内部变量之一无效时,无法使外部格式自动有效(通过键)。 尝试使用 演示版 从Angula