복붙노트

[SPRING] BindingResult가 @Valid를 따라야하는 이유는 무엇입니까?

SPRING

BindingResult가 @Valid를 따라야하는 이유는 무엇입니까?

오류가 발생했을 때 Spring MVC 유효성 검사가 제출 된 페이지로 돌아 가기 위해 고심하고있었습니다. BindingResult가 유효성을 검사하는 양식 매개 변수 옆에 있어야한다는 것을 알게되어 마침내 문제가 해결되었습니다.

예를 들어, spring.io 튜토리얼 (http://spring.io/guides/gs/validating-form-input/)의 checkPersonInfo 메소드를 수정하면,

@RequestMapping(value="/", method=RequestMethod.POST)
public String checkPersonInfo(@Valid Person person, BindingResult bindingResult, Model model) {
    if (bindingResult.hasErrors()) {
        return "form";
    }
    return "redirect:/results";
}

그럼 작동하고 양식 페이지로 리디렉션하지만, 만약 내가 그것을 변경 -

@RequestMapping(value="/", method=RequestMethod.POST)
public String checkPersonInfo(@Valid Person person, Model model, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "form";
    }
    return "redirect:/results";
}

그런 다음 / errors로 리디렉션됩니다.

이것의 원인은 무엇입니까?

해결법

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

    1.BindingResult는 바인딩 된 객체를 따라야합니다. 그 이유는 바인딩 된 객체가 더 많은 경우 어떤 BindingResult가 어떤 객체에 속해야 하는지를 알아야하기 때문입니다.

    BindingResult는 바인딩 된 객체를 따라야합니다. 그 이유는 바인딩 된 객체가 더 많은 경우 어떤 BindingResult가 어떤 객체에 속해야 하는지를 알아야하기 때문입니다.

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

    2.요청 처리기에 여러 개의 모델 속성이있을 수 있으며 각각은 자체 바인딩 결과를가집니다. 이를 위해 Spring은 이전 매개 변수에 바인딩 결과 매개 변수를 바인딩하기로 결정했습니다.

    요청 처리기에 여러 개의 모델 속성이있을 수 있으며 각각은 자체 바인딩 결과를가집니다. 이를 위해 Spring은 이전 매개 변수에 바인딩 결과 매개 변수를 바인딩하기로 결정했습니다.

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

    3.예, 오늘 제출 된 페이지로 돌아갈 수없는 이유를 확인하기 위해 오랜 시간이 걸렸지 만 기본 허용 된 오류 페이지로 이동합니다.

    예, 오늘 제출 된 페이지로 돌아갈 수없는 이유를 확인하기 위해 오랜 시간이 걸렸지 만 기본 허용 된 오류 페이지로 이동합니다.

    디버깅 후 소스 코드가 있습니다.

    // org.springframework.web.method.annotation.ModelAttributeMethodProcessor#resolveArgument
    if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) {
        throw new BindException(binder.getBindingResult());
    }
    

    BindingResult가 @Valid를 따르지 않으면 isBindExceptionRequired (binder, parameter)가 true를 반환하고 직접 예외를 throw하므로 컨트롤러 메서드에서 코드를 실행할 수 없습니다.

    // org.springframework.web.method.annotation.ModelAttributeMethodProcessor#isBindExceptionRequired 
    protected boolean isBindExceptionRequired(WebDataBinder binder, MethodParameter methodParam) {
        int i = methodParam.getParameterIndex();
        Class<?>[] paramTypes = methodParam.getMethod().getParameterTypes();
        boolean hasBindingResult = (paramTypes.length > (i + 1) && Errors.class.isAssignableFrom(paramTypes[i + 1]));
        return !hasBindingResult;
    }  
    
  4. from https://stackoverflow.com/questions/28887780/why-does-bindingresult-have-to-follow-valid by cc-by-sa and MIT license