복붙노트

[SPRING] MultiActionController에서 Spring 유효성 검사를 수행하는 방법은 무엇입니까?

SPRING

MultiActionController에서 Spring 유효성 검사를 수행하는 방법은 무엇입니까?

MultiActionController에서 Spring 유효성 검사를 수행하는 방법은 무엇입니까?

해결법

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

    1.다음 중 하나를 써 보겠습니다.

    다음 중 하나를 써 보겠습니다.

    public class Person {
    
        private String name;
        private Integer age;
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    

    그리고 당신의 MultiActionController

    import static org.springframework.validation.ValidationUtils.*;
    
    @Component
    public class PersonController extends MultiActionController {
    
        public PersonController() {
            setMethodNameResolver(new InternalPathMethodNameResolver());
    
            setValidators(new Validator[] {new Validator() {
                public boolean supports(Class clazz) {
                    return clazz.isAssignableFrom(Person.class);
                }
    
                public void validate(Object command, Errors errors) {
                    rejectIfEmpty(errors, "age", "", "Age is required");
                    rejectIfEmptyOrWhitespace(errors, "name", "", "Name is required");
                }
    
            }});
        }
    
        public ModelAndView add(HttpServletRequest request, HttpServletResponse response, Person person) throws Exception {
            // do something (save our Person object, for instance)
    
            return new ModelAndView();
        }
    
    }    
    

    MultiActionController는 MultiActionController에서 사용하는 모든 유효성 검사기를 제공해야하는 validators라는 속성을 정의합니다. 여기에서 MultiActionController 내부에서 Command 객체의 유효성을 확인하는 코드를 볼 수 있습니다.

    ServletRequestDataBinder binder = ...
    
    if (this.validators != null) 
        for (int i = 0; i < this.validators.length; i++) {
            if (this.validators[i].supports(command.getClass())) {
        ValidationUtils.invokeValidator(this.validators[i], command, binder.getBindingResult());
            }
        }
    }
    
    /**
      * Notice closeNoCatch method
      */
    binder.closeNoCatch();
    

    closeNoCatch 메서드는 말한다.

    따라서 Validator가 오류를 반환하면 closeNoCatch는 ServletRequestBindingException을 발생시킵니다. 하지만 다음과 같이 MultiActionController 메서드에서이 메서드를 catch 할 수 있습니다.

    public ModelAndView hanldeBindException(HttpServletRequest request, HttpServletResponse response, ServletRequestBindingException bindingException) {
        // do what you want right here
    
        BindException bindException = (BindException) bindingException.getRootCause();
    
        return new ModelAndView("personValidatorView").addAllObjects(bindException.getModel());
    }
    

    테스트를 위해서 다음 중 하나를 해봅시다.

    @Test
    public void failureValidation() throws Exception {
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setMethod("POST");
        request.setRequestURI("http://127.0.0.1:8080/myContext/person/add.html");
    
        /**
         * Empty values
         */
        request.addParameter("name", "");
        request.addParameter("age", "");
    
        PersonController personController = new PersonController();
    
        ModelAndView mav = personController.handleRequest(request, new MockHttpServletResponse());
    
        BindingResult bindingResult = (BindingResult) mav.getModel().get(BindingResult.MODEL_KEY_PREFIX + "command");
    
        /**
         * Our Validator rejected 2 Error
         */
        assertTrue(bindingResult.getErrorCount() == 2);
        for (Object object : bindingResult.getAllErrors()) {
            if(object instanceof FieldError) {
                FieldError fieldError = (FieldError) object;
    
                System.out.println(fieldError.getField());
            }
        }
    }
    
  2. from https://stackoverflow.com/questions/2744587/how-to-perform-spring-validation-in-multiactioncontroller by cc-by-sa and MIT license