programing

@유효한 주석으로 하위 개체 목록의 유효성을 검사하지 않습니다.

bestcode 2022. 9. 5. 23:01
반응형

@유효한 주석으로 하위 개체 목록의 유효성을 검사하지 않습니다.

주요 모델 클래스는 다음과 같습니다.

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프로퍼티, 를 조사합니다.AddressFormclass 및 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

반응형