복붙노트

[SPRING] Spring MVC @ Valid Validation with Custom HandlerMethodArgumentResolver

SPRING

Spring MVC @ Valid Validation with Custom HandlerMethodArgumentResolver

다음 @Controller 핸들러 메서드 정의를 처리 할 수있는 사용자 정의 HandlerMethodArgumentResolver를 등록하려고합니다.

@RequestMapping(method = RequestMethod.POST)
public String createDomain(@Valid Domain domain, BindingResult errors, @RequestParam("countryId") Long countryId) {

WebMvcConfigurerAdapter에서 addArgumentResolver ()를 재정 의하여 요청 매개 변수를 통해 Domain 객체를 만드는 리졸버를 등록 할 수 있습니다. Spring이 Domain 매개 변수를 분석하려고 할 때, HandlerMethodArgumentResolver의 목록 (많은 부분이 있음)을 통해 지원하는 첫 번째 항목을 선택합니다 ().

위의 예에서 내 해결자가 호출되고 내 Domain 인수가 초기화되지만 @Valid 주석이 처리되지 않고 BindingResult, ErrorsMethodArgumentResolver에 대한 해결 프로그램이 @ModelAttribute, @RequestBody 또는 @RequestPart 인수에는 핸들러 메서드가 있습니다.

@ModelAttribute를 추가하여 문제를 해결하려고하면

@RequestMapping(method = RequestMethod.POST)
public String createDomain(@Valid @ModelAttribute Domain domain, BindingResult errors, @RequestParam("countryId") Long countryId) {

HandlerMethodArgumentResolver 구현 인 ModelAttributeMethodProcessor는 먼저 supports ()로 검사하고 @modelAttribute 및 @Valid를 사용하여 사용자 정의 해결 프로그램에서 인수를 확인합니다. BindingResult는 실패하지 않지만 Domain 인스턴스에서 사용자 지정 만들기 동작을 수행하지 않습니다.

유효성 검사를위한 코드를 복사하여 ModelAttributeMethodProcessor에있는 모델에 추가 할 수는 있지만 모델에 객체를 추가하지 않고도 매개 변수를 확인하고 유효성 검사를 수행하는 더 쉬운 방법이 있었으면합니다. 그런 방법이 있습니까?

해결법

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

    1.당신이 직면하고있는 문제에 대한 좋은 설명.

    당신이 직면하고있는 문제에 대한 좋은 설명.

    내가 정의한 코드를 체크하고 같은 결론을 내 렸습니다. 동시에 정의 된 HandlerMethodArgumentResolver와 @Valid 관련 유효성 검사를 동시에 적용 할 수있는 기본 제공 방법이 없습니다. 유일한 선택은 ModelAttributeMethodProcessor가 수행하는 작업은 매개 변수에 @Valid 주석이 있는지 확인하고 유효성 검사 로직 관련 코드를 호출하는 것입니다.

    ModelAttributeMethodProcessor에서 HandlerMethodResolverArgumentResolver를 파생시키고 기존 코드가 활용되는 방식으로 super.validateIfApplicable (..)을 호출 할 수 있습니다.

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

    2.너무 늦을 지 모르지만 HandlerMethodArgumentResolver가 마지막 인수로 WebDataBinderFactory 객체를 가져온 다음 유효성 검사를 연결하려면 간단히 이것을 구현 자 구현에 추가하십시오.

    너무 늦을 지 모르지만 HandlerMethodArgumentResolver가 마지막 인수로 WebDataBinderFactory 객체를 가져온 다음 유효성 검사를 연결하려면 간단히 이것을 구현 자 구현에 추가하십시오.

    Object resolvedObject = // your logic 
    if(parameter.hasParameterAnnotation(Valid.class){
                binderFactory.createBinder(webRequest,resolvedObject,"resolvedObjectLogicalName").validate ();
    }
    
  3. from https://stackoverflow.com/questions/18091936/spring-mvc-valid-validation-with-custom-handlermethodargumentresolver by cc-by-sa and MIT license