[SPRING] Spring에서 객체 목록의 유효성 검사
SPRINGSpring에서 객체 목록의 유효성 검사
다음 컨트롤러 메서드가 있습니다.
@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.나는 또 다른 접근 방식을 발견했다. 기본적인 문제는 서비스에 대한 입력 페이로드로 목록을 가져오고 싶지만 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.목록 카테고리를 일부 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.가장 우아한 해결책은 Collection을위한 사용자 정의 검사기와 WebDataBinders에 해당 Validator를 등록하는 @ControllerAdvice를 작성하고, Controller 메소드의 Collection에 바인딩 된 RequestBody 매개 변수에 대한 Spring 유효성 검사를 수행하는 것입니다.
가장 우아한 해결책은 Collection을위한 사용자 정의 검사기와 WebDataBinders에 해당 Validator를 등록하는 @ControllerAdvice를 작성하고, Controller 메소드의 Collection에 바인딩 된 RequestBody 매개 변수에 대한 Spring 유효성 검사를 수행하는 것입니다.
-
==============================
4.컬렉션 유효성 검사가 직접 작동하지 않습니다.
컬렉션 유효성 검사가 직접 작동하지 않습니다.
예 : 여러 요소가 유효성 검사에 실패하면 어떻게해야합니까? 첫 번째 확인 후 중지 하시겠습니까? 모두 유효성 검사 (그렇다면 메시지 컬렉션을 통해 수행 할 작업)
당신의 설정 Spring에서 Hibernate Validator와 같은 Bean Validator 제공자에게 위임한다면, 거기에 Collection validator를 구현하는 방법을 찾아야한다.
최대 절전 모드의 경우 비슷한 문제가 여기에서 논의됩니다.
from https://stackoverflow.com/questions/28150405/validation-of-a-list-of-objects-in-spring by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Java 기반 구성을 사용하는이 Spring 애플리케이션이 제대로 작동하지 않는 이유 (0) | 2018.12.20 |
---|---|
[SPRING] @TestPropertySource 및 @PropertySource가 JUnit에서 작동하지 않습니다. (0) | 2018.12.20 |
[SPRING] Spring 데이터 jpa와 최대 절전 모드로 분리 된 엔티티가 ManyToMany 관계에서 지속되도록 전달됨 (0) | 2018.12.20 |
[SPRING] Spring v3 'mvc : resources'요소에 대한 선언을 찾을 수 없습니다. (0) | 2018.12.20 |
[SPRING] Autowired 환경이 null입니다. (0) | 2018.12.20 |