복붙노트

[SPRING] Spring 5 Webflux 기능 끝점 - 입력 유효성 검사를 수행하는 방법?

SPRING

Spring 5 Webflux 기능 끝점 - 입력 유효성 검사를 수행하는 방법?

현재 문서 (5.0.0.RELEASE)에 따르면 Spring Webflux는 주석이 달린 컨트롤러로 작업 할 때 유효성 검사를 지원합니다.

그러나 기능적인 끝점을 사용하여 자동화하는 방법에 대해서는 언급하지 않았습니다. 실제로 문서에서 입력 처리의 유일한 예는 아무 것도 검증하지 않습니다.

public Mono<ServerResponse> createPerson(ServerRequest request) { 
    Mono<Person> person = request.bodyToMono(Person.class);
    return ServerResponse.ok().build(repository.savePerson(person));
}

이 작업을 수동으로 수행해야합니까, 아니면 자동으로 수행 할 방법이 있습니까?

해결법

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

    1.Spring 버전 5.0에서는 기능 엔드 포인트에서 유효성 검사를 자동으로 수행 할 방법이 없으므로 이러한 유효성 검증은 수동으로 수행해야합니다.

    Spring 버전 5.0에서는 기능 엔드 포인트에서 유효성 검사를 자동으로 수행 할 방법이 없으므로 이러한 유효성 검증은 수동으로 수행해야합니다.

    현재 구체적인 계획은 없지만 앞으로는 일종의 검증을 추가 할 것입니다. 그러나 그때조차도 자동 메커니즘이 아닌 명시적인 메소드 호출이 될 것입니다. 전반적으로 기능 엔드 포인트 모델은 주석 기반 모델보다 훨씬 명확하게 설계되었습니다.

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

    2.arjen-poutsma가 말했듯이, Spring 5 기능 엔드 포인트에서 자동 검증을 실행할 방법이 없다.

    arjen-poutsma가 말했듯이, Spring 5 기능 엔드 포인트에서 자동 검증을 실행할 방법이 없다.

    Spring 문서는 이에 대해 명확하지 않으며 어떤 접근법도 제안하지 않는다.

    이 Baeldung 기사에서이 접근법을 사용하여 검증을 실행하는 방법에 대한 아이디어를 얻을 수 있습니다 (면책 조항 : 저는이 기사의 저자입니다 :))

    요약하면 다음 단계를 수행 할 수 있습니다.

    편집하다:

    저는이 관련 Spring 문제를 추적 해 왔으며, 이제이 주제와 관련된 공식 문서로 보입니다 : https://github.com/spring-projects/spring-framework/blob/master/src/docs/asciidoc/web /webflux-functional.adoc#validation

    제안 된 방법은이 기사에서 설명한대로 유효성 검사기를 사용하는 것입니다.

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

    3.현재 버전 (2.0.4.RELEASE)에서는 핸들을 사용하여 자동 유효성 검사를 수행하는 방법이 없지만 항상 다음과 같은 수동 유효성 검사를 수행 할 수 있습니다.

    현재 버전 (2.0.4.RELEASE)에서는 핸들을 사용하여 자동 유효성 검사를 수행하는 방법이 없지만 항상 다음과 같은 수동 유효성 검사를 수행 할 수 있습니다.

    @Slf4j
    @Component
    @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
    @RequiredArgsConstructor
    public class MyHandlerValidator implements HandlerValidator<MyResource> {
    
        Validator validator;
    
        @Override
        public void callValidator(final MyResource fdr) {
            final DataBinder binder = new DataBinder(fdr);
            binder.setValidator(validator);
            binder.validate();
    
            if (binder.getBindingResult().hasErrors()) {
                final String reason = binder.getBindingResult().getFieldError().toString();
                log.error(reason);
                throw new ResponseStatusException(HttpStatus.BAD_REQUEST, reason);
            }
        }   
    }
    

    자동 유효성 검사와 같은 WebExchangeBindException을 던져야하지만,이 예외를 생성하기 위해서는 종속성이있는 MethodParameter 마녀를 만들 수 없습니다.

  4. from https://stackoverflow.com/questions/46508618/spring-5-webflux-functional-endpoints-how-to-perform-input-validation by cc-by-sa and MIT license