@有效批注未验证子对象列表

主要模型类别如下:

公共类用户地址表单{
@空空如也
私有字符串名;
@空空如也
私有字符串lastName;
私人列表<地址表单>地址;
//二传手和接球手
}

公共类地址表单{
@空空如也
私有字符串customName;
@空空如也
私人城市;
@空空如也
私家弦街;
@空空如也
私人字符串streehno;
@空空如也
私人国家;
@空空如也
私人字符串邮政编码;
//二传手和接球手
}

我的一个控制器中的端点:

@RequestMapping(value="/up",method=RequestMethod.POST)
公共字符串completeForm(@[email protected]("userAddressesForm")userAddressesForm userAddressesForm,
BindingResult结果,HttpServletRequest请求){
//这里的逻辑
}

.jsp页面:

<form:formcommandname="“用户地址表单”;行动="“注册”&燃气轮机;
<表>
<tr>
<td类=”类;formLabels&quot&燃气轮机&书信电报;形式:标签路径="“名字”&燃气轮机;
<spring:消息代码="标签.名称“/&燃气轮机;
&lt/形式:标签&gt&lt/td>
<td&gt&书信电报;形式:输入路径="“名字”/&燃气轮机&lt/td>
<td&gt&书信电报;形式:错误路径="“名字”;cssClass="“错误”/&燃气轮机&lt/td>
&lt/tr>
<tr>
<td类=”类;formLabels&quot&燃气轮机&书信电报;形式:标签路径="“姓氏”&燃气轮机;
<spring:消息代码="标签.姓氏“/&燃气轮机;
&lt/形式:标签&gt&lt/td>
<td&gt&书信电报;“输入路径=”;“姓氏”/&燃气轮机&lt/td>
<td&gt&书信电报;形式:错误路径="“姓氏”;cssClass="“错误”/&燃气轮机&lt/td>
&lt/tr>
&lt/表>
<c:forEach items=&quot${userAddressesForm.addresses}"varStatus="gridRow“&燃气轮机;
<div id="主地址;类别=“类”;地址“数据表”&燃气轮机;
<字段集>
<图例&gt&书信电报;spring:消息代码="label.stepThreeMainAddressInfo“/&燃气轮机&lt/图例>
<a href=&quot#&引用;类别=“类”;删除项目“&燃气轮机&lt/a>
<表>
<tr>
<td类=”类;formLabels&quot&燃气轮机;
<spring:消息代码="标签.地址.自定义.名称“/&燃气轮机;
&lt/td>
<td>
<spring:bindpath="地址[${gridRow.index}].customName&quot&燃气轮机;
<输入类型="输入“;名称=“名称”&书信电报;c:输出值=“输出值”${status.expression}&quot/&燃气轮机&引用;
id=”号&书信电报;c:输出值=“输出值”${status.expression}&quot/&燃气轮机&引用;
值=”&书信电报;c:输出值=“输出值”${status.value}&quot/&燃气轮机&引用/&燃气轮机;
<形式:错误路径=&quot${status.expression}&quot/&燃气轮机;
&lt/弹簧:绑定>
&lt/td>
&lt/tr>
<tr>
<td类=”类;formLabels&quot&燃气轮机;
<spring:消息代码="标签.StreetInstanthren“/&燃气轮机;
&lt/td>
<td>
<spring:bindpath="地址[${gridRow.index}].streetAn&quot&燃气轮机;
<输入类型="输入“;名称=“名称”&书信电报;c:输出值=“输出值”${status.expression}&quot/&燃气轮机&引用;
id=”号&书信电报;c:输出值=“输出值”${status.expression}&quot/&燃气轮机&引用;
值=”&书信电报;c:输出值=“输出值”${status.value}&quot/&燃气轮机&引用/&燃气轮机;
&lt/弹簧:绑定>
<spring:bindpath="地址[${gridRow.index}].streehno&quot&燃气轮机;
<输入类型="输入“;名称=“名称”&书信电报;c:输出值=“输出值”${status.expression}&quot/&燃气轮机&引用;
id=”号&书信电报;c:输出值=“输出值”${status.expression}&quot/&燃气轮机&引用;
值=”&书信电报;c:输出值=“输出值”${status.value}&quot/&燃气轮机&引用&燃气轮机;
<形式:错误路径="地址[${gridRow.index}].streehno&quot/&燃气轮机;
&lt/弹簧:绑定>
&lt/td>
&lt/tr>
<tr>
<td类=”类;formLabels&quot&燃气轮机;
<spring:消息代码="标签.邮政编码「/&燃气轮机;
&lt/td>
<td>
<spring:bindpath="地址[${gridRow.index}]。邮政编码“&燃气轮机;
<输入类型="输入“;名称=“名称”&书信电报;c:输出值=“输出值”${status.expression}&quot/&燃气轮机&引用;
id=”号&书信电报;c:输出值=“输出值”${status.expression}&quot/&燃气轮机&引用;
值=”&书信电报;c:输出值=“输出值”${status.value}&quot/&燃气轮机&引用/&燃气轮机;
&lt/弹簧:绑定>
&lt/td>
&lt/tr>
<tr>
<td类=”类;formLabels&quot&燃气轮机;
<spring:消息代码="“城市”标签/&燃气轮机;
&lt/td>
<td>
<spring:bindpath="地址[${gridRow.index}].city“&燃气轮机;
<输入类型="输入“;名称=“名称”&书信电报;c:输出值=“输出值”${status.expression}&quot/&燃气轮机&引用;
id=”号&书信电报;c:输出值=“输出值”${status.expression}&quot/&燃气轮机&引用;
值=”&书信电报;c:输出值=“输出值”${status.value}&quot/&燃气轮机&引用/&燃气轮机;
<形式:错误路径="地址[${gridRow.index}].city“;cssClass="“错误”/&燃气轮机;
&lt/弹簧:绑定>
&lt/td>
&lt/tr>
&lt/表>
&lt/字段集>
&lt/部门>
&lt/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中的新功能

发表评论