Spring WebFlux RestControllerAdvice 에러

sunlog·2022년 2월 14일
0

트러블 슈팅

목록 보기
1/3
post-thumbnail

문제사항

  1. @RestControllerAdvice 어노테이션과 @ExceptionHandler 어노테이션 사용중 원하는 핸들러로 매칭이 안됨

원인 및 시도해본 방안들

  1. @valid 어노테이션을 이용해서 파라미터 유효값 체크 중 List 같은 Collection은 JavaBean이 아니기때문에 @NotNull과 같은 valid체크에 걸리지 않는 문제가 있음 -> 해당 문제 Validator implements해서 수정

  2. Webflux는 BindingResult 지원하지 않는 오류로 다른 방법으로 수정중

    → 아래 참조 2를 보면 WebExchangeBindException가 BindingResult implements 한걸로 보여서 해당 방법으로 수정해봄

  3. WebFlux는 모델 바인딩이 별도 쓰레드에서 발생하므로 컨트롤러 파라미터로 얻을 수 없다고 합니다... onErrorXX 메소드로 수정 테스트중

    → 위 방법으로 했을때 해결됨 (ConstraintViolationException 예외 캐치됨)

    @PostMapping("/")
    public Mono<ResponseEntity<Integer>> insert(@Valid @RequestBody List<Vo> list) {
    	int result = approvalService.insert(list);
    	return Mono.just(new ResponseEntity<>(result, HttpStatus.OK))
    			.onErrorResume(
    					WebExchangeBindException.class
                        , throwable -> Mono.just(new ResponseEntity<>(null, HttpStatus.BAD_REQUEST))
                    );
    }

참조

1. Validator 추상화하여 Collection Validate

SpringMVC에서 Collection의 Validation · HomoEfficio/dev-tips Wiki

2. WebFlux에서 BindingResult 사용 불가

[에러메세지] For @RequestBody and @RequestPart arguments, please declare them with a reactive type wrapper and use its onError operators to handle WebExchangeBindException:

WebExchangeBindException (Spring Framework 5.3.15 API)

3. onErrorXX메소드 사용법 예시 URL

Spring WebFlux에서 Error 처리와 Retry 전략

0개의 댓글