복붙노트

[SPRING] Spring에서 객체 목록의 유효성 검사

SPRING

Spring에서 객체 목록의 유효성 검사

다음 컨트롤러 메서드가 있습니다.

@RequestMapping(value="/map/update", method=RequestMethod.POST, produces = "application/json; charset=utf-8")
@ResponseBody
public ResponseEntityWrapper updateMapTheme(
        HttpServletRequest request, 
        @RequestBody @Valid List<CompanyTag> categories,
        HttpServletResponse response
        ) throws ResourceNotFoundException, AuthorizationException {
...
}

CompanyTag는 다음과 같이 정의됩니다.

public class CompanyTag {
    @StringUUIDValidation String key;
    String value;
    String color;
    String icon;
    Icon iconObj;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }
   ...
}

문제는 유효성 검사가 실행되지 않고 CompanyTag 목록의 유효성이 검사되지 않으며 "StringUUIDValidation"유효성 검사기가 호출되지 않는다는 것입니다.

목록을 삭제하고 단 하나의 CompanyTag (예 :

@RequestBody @Valid List<CompanyTag> categories,

용도:

@RequestBody @Valid CompanyTag category,

예상대로 작동하므로 분명히 Spring은 사물 목록을 검증하는 것을 좋아하지 않는다. (대신 어레이로 시도 했는데도 작동하지 않았다.)

누락 된 것이있는 사람이 있습니까?

해결법

  1. ==============================

    1.나는 또 다른 접근 방식을 발견했다. 기본적인 문제는 서비스에 대한 입력 페이로드로 목록을 가져오고 싶지만 javax.validation은 JavaBean 만 목록의 유효성을 검사하지 않습니다. 트릭은 List와 JavaBean 둘 모두로 작동하는 사용자 정의 목록 클래스를 사용하는 것입니다.

    나는 또 다른 접근 방식을 발견했다. 기본적인 문제는 서비스에 대한 입력 페이로드로 목록을 가져오고 싶지만 javax.validation은 JavaBean 만 목록의 유효성을 검사하지 않습니다. 트릭은 List와 JavaBean 둘 모두로 작동하는 사용자 정의 목록 클래스를 사용하는 것입니다.

    @RequestBody @Valid List<CompanyTag> categories
    

    로 변경:

    @RequestBody @Valid ValidList<CompanyTag> categories
    

    목록 하위 클래스는 다음과 같습니다.

    public class ValidList<E> implements List<E> {
    
        @Valid
        private List<E> list;
    
        public ValidList() {
            this.list = new ArrayList<E>();
        }
    
        public ValidList(List<E> list) {
            this.list = list;
        }
    
        // Bean-like methods, used by javax.validation but ignored by JSON parsing
    
        public List<E> getList() {
            return list;
        }
    
        public void setList(List<E> list) {
            this.list = list;
        }
    
        // List-like methods, used by JSON parsing but ignored by javax.validation
    
        @Override
        public int size() {
            return list.size();
        }
    
        @Override
        public boolean isEmpty() {
            return list.isEmpty();
        }
    
        // Other list methods ...
    }
    
  2. ==============================

    2.목록 카테고리를 일부 DTO 빈에 랩하고 유효성을 검사 할 것을 제안합니다. 작업 유효성 검증 외에 더 유연한 API의 이점을 누릴 수 있습니다.

    목록 카테고리를 일부 DTO 빈에 랩하고 유효성을 검사 할 것을 제안합니다. 작업 유효성 검증 외에 더 유연한 API의 이점을 누릴 수 있습니다.

    @RequestMapping(value="/map/update", method=RequestMethod.POST, produces = "application/json; charset=utf-8")
    @ResponseBody
    public ResponseEntityWrapper updateMapTheme(
        HttpServletRequest request, 
        @RequestBody @Valid TagRequest tagRequest,
        HttpServletResponse response
        ) throws ResourceNotFoundException, AuthorizationException {
    ...
    }
    
    public static class TagRequest {
        @Valid
        List<CompanyTag> categories;    
        // Gettes setters
    }
    
  3. ==============================

    3.가장 우아한 해결책은 Collection을위한 사용자 정의 검사기와 WebDataBinders에 해당 Validator를 등록하는 @ControllerAdvice를 작성하고, Controller 메소드의 Collection에 바인딩 된 RequestBody 매개 변수에 대한 Spring 유효성 검사를 수행하는 것입니다.

    가장 우아한 해결책은 Collection을위한 사용자 정의 검사기와 WebDataBinders에 해당 Validator를 등록하는 @ControllerAdvice를 작성하고, Controller 메소드의 Collection에 바인딩 된 RequestBody 매개 변수에 대한 Spring 유효성 검사를 수행하는 것입니다.

  4. ==============================

    4.컬렉션 유효성 검사가 직접 작동하지 않습니다.

    컬렉션 유효성 검사가 직접 작동하지 않습니다.

    예 : 여러 요소가 유효성 검사에 실패하면 어떻게해야합니까? 첫 번째 확인 후 중지 하시겠습니까? 모두 유효성 검사 (그렇다면 메시지 컬렉션을 통해 수행 할 작업)

    당신의 설정 Spring에서 Hibernate Validator와 같은 Bean Validator 제공자에게 위임한다면, 거기에 Collection validator를 구현하는 방법을 찾아야한다.

    최대 절전 모드의 경우 비슷한 문제가 여기에서 논의됩니다.

  5. from https://stackoverflow.com/questions/28150405/validation-of-a-list-of-objects-in-spring by cc-by-sa and MIT license