복붙노트

[SPRING] Spring MVC - REST 서비스의 빈리스트에 @Valid

SPRING

Spring MVC - REST 서비스의 빈리스트에 @Valid

Spring MVC REST 서비스 (json)에서는 다음과 같은 컨트롤러 메소드가있다.

@RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
@ResponseBody
public List<...> myMethod(@Valid @RequestBody List<MyBean> request, BindingResult bindingResult) {

MyBean 클래스에 bean 유효성 검사 주석이있는 곳.

유효성 검사는이 경우에는 발생하지 않지만 다른 컨트롤러에서는 유효합니다.

json 입력을 변경하는 목록에이 목록을 캡슐화하고 싶지 않습니다.

콩 목록에 대한 유효성 검사가없는 이유는 무엇입니까? 대안은 무엇입니까?

해결법

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

    1.@Valid는 JSR-303 주석이며 JSR-303은 JavaBeans의 유효성 검사에 적용됩니다. java.util.List는 (JavaBean의 공식적인 설명에 따라) JavaBean이 아니므로 JSR-303 준수 검사기를 사용하여 직접 유효성을 검사 할 수 없습니다. 이것은 두 가지 관찰에 의해 뒷받침된다.

    @Valid는 JSR-303 주석이며 JSR-303은 JavaBeans의 유효성 검사에 적용됩니다. java.util.List는 (JavaBean의 공식적인 설명에 따라) JavaBean이 아니므로 JSR-303 준수 검사기를 사용하여 직접 유효성을 검사 할 수 없습니다. 이것은 두 가지 관찰에 의해 뒷받침된다.

  2. ==============================

    2.이 작업을 수행 할 수있는 유일한 방법은 목록을 래핑하는 것입니다. 이는 또한 JSON 입력을 변경해야한다는 것을 의미합니다.

    이 작업을 수행 할 수있는 유일한 방법은 목록을 래핑하는 것입니다. 이는 또한 JSON 입력을 변경해야한다는 것을 의미합니다.

    @RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
    @ResponseBody
    public List<...> myMethod(@Valid @RequestBody List<MyBean> request, BindingResult bindingResult) {
    

    다음과 같이됩니다.

    @RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
    @ResponseBody
    public List<...> myMethod(@Valid @RequestBody MyBeanList request, BindingResult bindingResult) {
    

    우리는 또한 다음을 필요로합니다.

    import javax.validation.Valid;
    import java.util.List;
    
    public class MyBeanList {
    
        @Valid
        List<MyBean> list;
    
        //getters and setters....
    }
    

    이것은 목록에 대한 사용자 정의 유효성 검사기로도 가능할 수 있지만 아직까지는 얻지 못했던 것처럼 보입니다.

    참조 : http://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html

  3. ==============================

    3.직접 검증을 시도하십시오. 이 같은:

    직접 검증을 시도하십시오. 이 같은:

    @Autowired
    Validator validator;
    
    @RequestMapping(method = RequestMethod.POST, value = { "/doesntmatter" })
    @ResponseBody
    public Object myMethod(@RequestBody List<Object> request, BindingResult bindingResult) {
        for (int i = 0; i < request.size(); i++) {
            Object o = request.get(i);
            BeanPropertyBindingResult errors = new BeanPropertyBindingResult(o, String.format("o[%d]", i));
            validator.validate(o, errors);
            if (errors.hasErrors())
                bindingResult.addAllErrors(errors);
        }
        if (bindingResult.hasErrors())
            ...
    
  4. ==============================

    4.org.springframework.validation.beanvalidation.LocalValidatorFactoryBean을 멤버로 사용하여 사용자 정의 유효성 검사기를 구현하고 각 항목에 대한 유효성 검사기를 호출하십시오.

    org.springframework.validation.beanvalidation.LocalValidatorFactoryBean을 멤버로 사용하여 사용자 정의 유효성 검사기를 구현하고 각 항목에 대한 유효성 검사기를 호출하십시오.

    public class CheckOutValidator implements Validator {
    
    
        private Validator validator;
    
       @Override
        public void validate(Object target, Errors errors) { 
        List request = (List) target;
        Iterator it = request.iterator()   
        while(it.hasNext()) {
        MyBean b = it.next();
        validator.validate(b, errors);
    
         }
    
         }
    
    //setters and getters
    
    }
    
  5. ==============================

    5.List와 JavaBean의 역할을하는 커스텀 java.util.List에서 요청을 감싸는 우아한 방법이있다. 여길 봐

    List와 JavaBean의 역할을하는 커스텀 java.util.List에서 요청을 감싸는 우아한 방법이있다. 여길 봐

  6. ==============================

    6.가지고있는 각 List에 대해 래퍼를 쓰고 싶지 않다면 일반 래퍼를 사용할 수 있습니다 :

    가지고있는 각 List에 대해 래퍼를 쓰고 싶지 않다면 일반 래퍼를 사용할 수 있습니다 :

    public class ListWrapper<E> {
    
        private List<E> list;
    
        public ListWrapper() {
            list = new ArrayList<>();
        }
    
        public ListWrapper(List<E> list) {
            this.list = list;
        }
    
        @Valid
        public List<E> getList() {
            return list;
        }
    
        public void setList(List<E> list) {
            this.list = list;
        }
    
        public boolean add(E e) {
            return list.add(e);
        }
    
        public void clear() {
            list.clear();
        }
    
    }
    
  7. ==============================

    7.가장 좋은 방법은 목록을 래핑하는 것입니다 - Spring MVC에서 Bean이 아닌 요청 매개 변수의 유효성을 검사하는 방법은 무엇입니까?

    가장 좋은 방법은 목록을 래핑하는 것입니다 - Spring MVC에서 Bean이 아닌 요청 매개 변수의 유효성을 검사하는 방법은 무엇입니까?

    @Valid가 컬렉션 요소에 적용된다고 말하는 방법은 없습니다.

  8. from https://stackoverflow.com/questions/17207766/spring-mvc-valid-on-list-of-beans-in-rest-service by cc-by-sa and MIT license