1

what is the right way to handle errors in spring-webflux에 제안 된 3 가지 솔루션을 모두 시도했지만 이 호출되지 않습니다. 나는 Spring Boot 2.0.0.M7을 사용하고 있습니다. Github에서 REPO hereSpring 5 Reactive - WebExceptionHandler가 호출되지 않습니다.

@Configuration 
class RoutesConfiguration { 

    @Autowired 
    private lateinit var testService: TestService 

    @Autowired 
    private lateinit var globalErrorHandler: GlobalErrorHandler 

    @Bean 
    fun routerFunction(): 

    RouterFunction<ServerResponse> = router { 
    ("/test").nest { 

     GET("/") { 
     ServerResponse.ok().body(testService.test()) 
     } 
    } 
    } 


} 


@Component 
class GlobalErrorHandler() : WebExceptionHandler { 

    companion object { 
    private val log = LoggerFactory.getLogger(GlobalErrorHandler::class.java) 
    } 

    override fun handle(exchange: ServerWebExchange?, ex: Throwable?): Mono<Void> { 

    log.info("inside handle") 

    /* Handle different exceptions here */ 
    when(ex!!) { 
     is ClientException -> exchange!!.response.statusCode = HttpStatus.BAD_REQUEST 
     is Exception -> exchange!!.response.statusCode = HttpStatus.INTERNAL_SERVER_ERROR 
    } 

    return Mono.empty() 
    } 
} 

업데이트 : 2.0.0.M2에 봄 부트 버전을 변경하면 WebExceptionHandler

라고지고 있습니다. 2.0.0.M7에 대해 조치를 취해야합니까?

는 해결책 :

브라이언의 제안에 따라, 그것은 그렇지 않으면 오류를 처리 할 수, 당신은 당신의 자신의 WebExceptionHandler를 제공 할 수 있습니다,하지만 당신은 다른 사람에게 상대적를 주문해야

@Bean 
@Order(-2) 
fun globalErrorHandler() = GlobalErrorHandler() 

답변

3

로 일했다 네가 시도하기 전에.

  • 오류 처리 (see reference documentation)에 대한 봄 부팅에 의해 제공되는 DefaultErrorWebExceptionHandler-1
  • 에서 주문하는 ResponseStatusExceptionHandler 스프링 프레임 워크가 제공하는 그래서 당신이 당신의 오류 처리에 @Order(-2)을 추가 할 수 있습니다 0

에서 주문한 기존 구성 요소보다 먼저 주문해야합니다.

+0

스프링 부트 빌트인 'AbstractErrorWebExceptionHandler'는 웹 페이지 기반 애플리케이션의 글로벌 오류 처리에 더 친숙한 것으로 보입니다. REST 애플리케이션의 경우, http 상태와 엔티티를 설정하는 솔루션처럼'@ RestControllerAdvice'를 제공하는 것이 더 낫다고 생각합니다. – Hantsy