@Valid 注释不验证子对象列表 [英] @Valid annotation is not validating the list of child objects
问题描述
主要模型类如下:
public class UserAddressesForm {
@NotEmpty
private String firstName;
@NotEmpty
private String lastName;
private List<AddressForm> addresses;
// setters and getters
}
public class AddressForm {
@NotEmpty
private String customName;
@NotEmpty
private String city;
@NotEmpty
private String streetAn;
@NotEmpty
private String streetHn;
@NotEmpty
private String addressCountry;
@NotEmpty
private String postCode;
// setters and getters
}
我的一个控制器中的端点:
An endpoint in one of my controllers :
@RequestMapping(value = "/up", method = RequestMethod.POST)
public String completeForm(@Valid @ModelAttribute("userAddressesForm") UserAddressesForm userAddressesForm,
BindingResult result, HttpServletRequest req) {
// logic here
}
一个 .jsp
页面:
<form:form commandName="userAddressesForm" action="registered">
<table>
<tr>
<td class="formLabels"><form:label path="firstName">
<spring:message code="label.name" />
</form:label></td>
<td><form:input path="firstName" /></td>
<td><form:errors path="firstName" cssClass="error" /></td>
</tr>
<tr>
<td class="formLabels"><form:label path="lastName">
<spring:message code="label.surname" />
</form:label></td>
<td><form:input path="lastName" /></td>
<td><form:errors path="lastName" cssClass="error" /></td>
</tr>
</table>
<c:forEach items="${userAddressesForm.addresses}" varStatus="gridRow">
<div id="main_address" class="address_data_form">
<fieldset>
<legend><spring:message code="label.stepThreeMainAddressInfo" /></legend>
<a href="#" class="deleteItem"></a>
<table>
<tr>
<td class="formLabels">
<spring:message code="label.address.custom.name" />
</td>
<td>
<spring:bind path="addresses[${gridRow.index}].customName">
<input type="input" name="<c:out value="${status.expression}"/>"
id="<c:out value="${status.expression}"/>"
value="<c:out value="${status.value}"/>" />
<form:errors path="${status.expression}"/>
</spring:bind>
</td>
</tr>
<tr>
<td class="formLabels">
<spring:message code="label.streetAnStreetHn" />
</td>
<td>
<spring:bind path="addresses[${gridRow.index}].streetAn">
<input type="input" name="<c:out value="${status.expression}"/>"
id="<c:out value="${status.expression}"/>"
value="<c:out value="${status.value}"/>" />
</spring:bind>
<spring:bind path="addresses[${gridRow.index}].streetHn">
<input type="input" name="<c:out value="${status.expression}"/>"
id="<c:out value="${status.expression}"/>"
value="<c:out value="${status.value}"/>" >
<form:errors path="addresses[${gridRow.index}].streetHn"/>
</spring:bind>
</td>
</tr>
<tr>
<td class="formLabels">
<spring:message code="label.postCode" />
</td>
<td>
<spring:bind path="addresses[${gridRow.index}].postCode">
<input type="input" name="<c:out value="${status.expression}"/>"
id="<c:out value="${status.expression}"/>"
value="<c:out value="${status.value}"/>" />
</spring:bind>
</td>
</tr>
<tr>
<td class="formLabels">
<spring:message code="label.city" />
</td>
<td>
<spring:bind path="addresses[${gridRow.index}].city">
<input type="input" name="<c:out value="${status.expression}"/>"
id="<c:out value="${status.expression}"/>"
value="<c:out value="${status.value}"/>" />
<form:errors path="addresses[${gridRow.index}].city" cssClass="error" />
</spring:bind>
</td>
</tr>
</table>
</fieldset>
</div>
</c:forEach>
</c:forEach>
Why @Valid
is not validating the List<AddressForm> addresses
present in UserAddressesForm
class ?
为什么 @Valid
不验证 List
存在于UserAddressesForm
类中?
推荐答案
你需要用@Valid
注解修饰UserAddressesForm
的addresses
成员.请参阅 JSR 303:Bean 验证的第 3.1.3 和 3.5.1 节.正如我在回答是否有使用带注释的方法启用 JSR 303 Bean 验证的标准方法,这是 JSR 303 中 @Valid
注释的真正用途.
Edit Example code: Hibernate Validator- Object Graph. (The list of passengers in Car)
编辑示例代码:Hibernate Validator- Object图.(车内乘客名单)
Edit From Hibernate Validator 6 Reference doc:
编辑来自Hibernate Validator 6 参考文档:
在 6 之前的版本中,Hibernate Validator 支持对容器元素子集的级联验证,并且它是在容器级别实现的(例如,您将使用 @Valid private List
来启用级联Person
的验证).
This is still supported but is not recommended. Please use container
element level @Valid
annotations instead as it is more expressive.
仍然支持但不推荐这样做.请使用容器元素级别的 @Valid
注释,因为它更具表现力.
Example:
示例:
Also see what's new in Bean Validation 2.0/Jakarta Bean Validation.
这篇关于@Valid 注释不验证子对象列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!