@유효한 주석으로 하위 개체 목록의 유효성을 검사하지 않습니다.
주요 모델 클래스는 다음과 같습니다.
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
}
컨트롤러 중 하나의 엔드포인트:
@RequestMapping(value = "/up", method = RequestMethod.POST)
public String completeForm(@Valid @ModelAttribute("userAddressesForm") UserAddressesForm userAddressesForm,
BindingResult result, HttpServletRequest req) {
// logic here
}
A .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>
왜죠@Valid
가 검증되지 않았습니다.List<AddressForm> addresses
에 나타나다.UserAddressesForm
수업?
데코레이션이 필요해요.addresses
멤버UserAddressesForm
와 함께@Valid
주석입니다.JSR 303: Bean Validation 섹션 3.1.3 및 3.5.1을 참조하십시오.질문에 대한 답변에서 설명했듯이 주석 방식을 사용하여 JSR 303 Bean Validation을 활성화하는 표준 방법이 있습니까?라는 질문에 대한 답변에서 설명했듯이, 이것이 실제 사용법입니다.@Valid
주석은 JSR 303에 따른다.
예제 코드 편집:휴지 상태 검증기 - 객체 그래프(차량 내 승객 목록)
휴지 상태 Validator 6 레퍼런스 문서에서 편집:
6 이전 버전에서는 Hibernate Validator는 컨테이너 요소의 서브셋에 대해 캐스케이드 검증을 지원했으며 컨테이너 레벨에서 구현되었습니다(예:
@Valid private List<Person>
캐스케이드 검증을 유효하게 하다Person
).이는 계속 지원되지만 권장되지 않습니다.컨테이너 요소 수준을 사용하십시오.
@Valid
대신 주석을 사용합니다.
예제:
public class Car {
private List<@NotNull @Valid Person> passengers = new ArrayList<Person>();
private Map<@Valid Part, List<@Valid Manufacturer>> partManufacturers = new HashMap<>();
//...
}
또, Bean Validation 2.0/Jakarta Bean Validation의 신기능도 참조해 주세요.
@Ritesh 응답에 추가,@Valid
구속조건은 Bean Validator에게 적용된 속성의 유형을 조사하도록 지시하고 거기에서 발견된 모든 구속조건을 검증합니다.질문, 검증자 코드로 답변합니다.@Valid
에 대한 제약.addresses
프로퍼티, 를 조사합니다.AddressForm
class 및 validate allJSR 303
다음과 같은 제약 조건을 찾을 수 있습니다.
public class UserAddressesForm {
@NotEmpty
private String firstName;
@NotEmpty
private String lastName;
@Valid
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
클래스 UserAddresses폼에 다음 행을 추가합니다.
@Valid
private List<AddressForm> addresses;
유효한 솔루션.
public class UserAddressesForm {
@NotEmpty(message="firstName is required")
private String firstName;
@NotEmpty(message="lastNameis required")
private String lastName;
@NotNull(message="addresses attributes are required")
@Valid
private List<AddressForm> addresses;
...
setters and getters
public class AddressForm {
@NotEmpty(message="customNameis required")
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
나는 부모 클래스의 모든 제안과 주석이 달린 자식 필드를 구현했다.@Valid
하위 엔티티가 여전히 검증되지 않았습니다.
다행히 지금은 해결되었고 문제는 의존성 때문이었다.솔루션으로서 이하의 의존관계를 사용했다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
대신
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
저는요.@NotNull
, 아이에게는 없습니다.@NotEmpty
주석입니다.나는 그것을 넣어야 했다.@NotNull
이 되기 전에@Valid
작동시킬 수 있도록 하기 위해서요.
다음과 같습니다.
private List<@NotNull @Valid YourObject> yourObjects;
언급URL : https://stackoverflow.com/questions/5142065/valid-annotation-is-not-validating-the-list-of-child-objects
'programing' 카테고리의 다른 글
REST - JSON을 사용한HTTP 포스트 멀티파트 (0) | 2022.09.05 |
---|---|
열에서 고유한 값을 찾은 다음 정렬합니다. (0) | 2022.09.05 |
VueJS: 렌더 함수에서 계산된 값에 액세스하는 방법 (0) | 2022.09.05 |
auto_increment id가 1개씩 증가하지 않는 이유는 무엇입니까?설정 방법은? (0) | 2022.09.04 |
두 판다 DataFrame 열의 사전 작성 방법 (0) | 2022.09.04 |