主要模型类别如下:
公共类用户地址表单{
@空空如也
私有字符串名;
@空空如也
私有字符串lastName;
私人列表<;地址表单>;地址;
//二传手和接球手
}
公共类地址表单{
@空空如也
私有字符串customName;
@空空如也
私人城市;
@空空如也
私家弦街;
@空空如也
私人字符串streehno;
@空空如也
私人国家;
@空空如也
私人字符串邮政编码;
//二传手和接球手
}
我的一个控制器中的端点:
@RequestMapping(value=";/up";,method=RequestMethod.POST)
公共字符串completeForm(@[email protected](";userAddressesForm";)userAddressesForm userAddressesForm,
BindingResult结果,HttpServletRequest请求){
//这里的逻辑
}
.jsp页面:
<;form:formcommandname=";“用户地址表单”;行动=";“注册”&燃气轮机;
<;表>;
<;tr>;
<;td类=”类;formLabels"&燃气轮机&书信电报;形式:标签路径=";“名字”&燃气轮机;
<;spring:消息代码=";标签.名称“/&燃气轮机;
</形式:标签></td>;
<;td>&书信电报;形式:输入路径=";“名字”/&燃气轮机</td>;
<;td>&书信电报;形式:错误路径=";“名字”;cssClass=";“错误”/&燃气轮机</td>;
</tr>;
<;tr>;
<;td类=”类;formLabels"&燃气轮机&书信电报;形式:标签路径=";“姓氏”&燃气轮机;
<;spring:消息代码=";标签.姓氏“/&燃气轮机;
</形式:标签></td>;
<;td>&书信电报;“输入路径=”;“姓氏”/&燃气轮机</td>;
<;td>&书信电报;形式:错误路径=";“姓氏”;cssClass=";“错误”/&燃气轮机</td>;
</tr>;
</表>;
<;c:forEach items="${userAddressesForm.addresses}";varStatus=";gridRow“&燃气轮机;
<;div id=";主地址;类别=“类”;地址“数据表”&燃气轮机;
<;字段集>;
<;图例>&书信电报;spring:消息代码=";label.stepThreeMainAddressInfo“/&燃气轮机</图例>;
<;a href="#&引用;类别=“类”;删除项目“&燃气轮机</a>;
<;表>;
<;tr>;
<;td类=”类;formLabels"&燃气轮机;
<;spring:消息代码=";标签.地址.自定义.名称“/&燃气轮机;
</td>;
<;td>;
<;spring:bindpath=";地址[${gridRow.index}].customName"&燃气轮机;
<;输入类型=";输入“;名称=“名称”&书信电报;c:输出值=“输出值”${status.expression}"/&燃气轮机&引用;
id=”号&书信电报;c:输出值=“输出值”${status.expression}"/&燃气轮机&引用;
值=”&书信电报;c:输出值=“输出值”${status.value}"/&燃气轮机&引用/&燃气轮机;
<;形式:错误路径="${status.expression}"/&燃气轮机;
</弹簧:绑定>;
</td>;
</tr>;
<;tr>;
<;td类=”类;formLabels"&燃气轮机;
<;spring:消息代码=";标签.StreetInstanthren“/&燃气轮机;
</td>;
<;td>;
<;spring:bindpath=";地址[${gridRow.index}].streetAn"&燃气轮机;
<;输入类型=";输入“;名称=“名称”&书信电报;c:输出值=“输出值”${status.expression}"/&燃气轮机&引用;
id=”号&书信电报;c:输出值=“输出值”${status.expression}"/&燃气轮机&引用;
值=”&书信电报;c:输出值=“输出值”${status.value}"/&燃气轮机&引用/&燃气轮机;
</弹簧:绑定>;
<;spring:bindpath=";地址[${gridRow.index}].streehno"&燃气轮机;
<;输入类型=";输入“;名称=“名称”&书信电报;c:输出值=“输出值”${status.expression}"/&燃气轮机&引用;
id=”号&书信电报;c:输出值=“输出值”${status.expression}"/&燃气轮机&引用;
值=”&书信电报;c:输出值=“输出值”${status.value}"/&燃气轮机&引用&燃气轮机;
<;形式:错误路径=";地址[${gridRow.index}].streehno"/&燃气轮机;
</弹簧:绑定>;
</td>;
</tr>;
<;tr>;
<;td类=”类;formLabels"&燃气轮机;
<;spring:消息代码=";标签.邮政编码「/&燃气轮机;
</td>;
<;td>;
<;spring:bindpath=";地址[${gridRow.index}]。邮政编码“&燃气轮机;
<;输入类型=";输入“;名称=“名称”&书信电报;c:输出值=“输出值”${status.expression}"/&燃气轮机&引用;
id=”号&书信电报;c:输出值=“输出值”${status.expression}"/&燃气轮机&引用;
值=”&书信电报;c:输出值=“输出值”${status.value}"/&燃气轮机&引用/&燃气轮机;
</弹簧:绑定>;
</td>;
</tr>;
<;tr>;
<;td类=”类;formLabels"&燃气轮机;
<;spring:消息代码=";“城市”标签/&燃气轮机;
</td>;
<;td>;
<;spring:bindpath=";地址[${gridRow.index}].city“&燃气轮机;
<;输入类型=";输入“;名称=“名称”&书信电报;c:输出值=“输出值”${status.expression}"/&燃气轮机&引用;
id=”号&书信电报;c:输出值=“输出值”${status.expression}"/&燃气轮机&引用;
值=”&书信电报;c:输出值=“输出值”${status.value}"/&燃气轮机&引用/&燃气轮机;
<;形式:错误路径=";地址[${gridRow.index}].city“;cssClass=";“错误”/&燃气轮机;
</弹簧:绑定>;
</td>;
</tr>;
</表>;
</字段集>;
</部门>;
</c:forEach>;
为什么@Valid不验证列表<;地址格式>;地址是否存在于UserAddressesForm类中
您需要用@Valid注释装饰用户地址表单的地址成员。参见JSR303:Bean验证的第3.1.3节和第3.5.1节。正如我在回答这个问题时所解释的,是否有一种标准方法可以使用注释方法启用JSR303bean验证,这是根据JSR303使用@Valid注释的真正用途
编辑
示例代码:Hibernate验证程序-对象图。(车内乘客名单)
从Hibernate Validator 6参考文档编辑:
在6之前的版本中,Hibernate Validator支持容器元素子集的级联验证,并且它是在容器级别实现的(例如,您可以使用
@Valid private List<;Person>;为Person启用级联验证)这仍然受支持,但不建议这样做。请使用集装箱
元素级@有效的注释,因为它更具表现力
例如:
公车{
私人列表<;@[email protected]>;乘客=新阵列列表<;Person>;();
私有映射<;@有效零件,列表<;@有效制造商>;>;零件制造商=新哈希映射<;>;();
//...
}
另请参阅BeanValidation2.0/JakartaBeanValidation中的新功能