Строка, вставленная из страницы ошибки whitelabel в webflux? - PullRequest
0 голосов
/ 09 февраля 2020

Когда я использую org.springframework.boot: spring-boot-starter-web , я могу удалить страницу ошибки Whitelabel и вместо нее показывать свое сообщение, когда делать ссылку ресурс не найден:

application.yml

server:
  error:
    whitelabel:
      enabled: false
spring:
  mvc:
    throw-exception-if-no-handler-found: true
  resources:
    add-mappings: false

NotFoundResource.class

@RestControllerAdvice
class NotFoundResource {

    @ExceptionHandler(NoHandlerFoundException.class)
    public String handleNotFoundResource() {

        return "Requested resource wasn't found on the server"
    }
}

Как мне сделать это с webflux? В weblux не содержит NoHandlerFoundException.class.

1 Ответ

0 голосов
/ 12 февраля 2020

Вы можете создать свой собственный класс ErrorWebExceptionHandler для этого требования. Весенняя загрузочная документация дает представление об этом.

[Цитируется из документации]

Чтобы изменить поведение обработки ошибок, вы можете реализовать ErrorWebExceptionHandler и зарегистрировать определение компонента. такого типа Поскольку WebExceptionHandler является довольно низкоуровневым, Spring Boot также предоставляет удобный AbstractErrorWebExceptionHandler, позволяющий обрабатывать ошибки функциональным способом WebFlux, как показано в следующем примере

Для более полной картины вы также можете создать подкласс DefaultErrorWebExceptionHandler напрямую и переопределять определенные методы.

Вы можете установить некоторые точки останова на класс DefaultErrorWebExceptionHandler и проверить, как он работает для отображения ответа об ошибке. Затем, основываясь на требованиях вашего проекта, вы можете настроить его под свои нужды.

Вот очень простая вещь, которую я опробовал.

CustomErrorWebExceptionHandler class:

public class CustomErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler {

  public CustomErrorWebExceptionHandler(
      ErrorAttributes errorAttributes,
      ResourceProperties resourceProperties,
      ApplicationContext applicationContext) {
    super(errorAttributes, resourceProperties, applicationContext);
  }

  @Override
  protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {
    return route(all(), this::renderErrorResponse);
  }

  private Mono<ServerResponse> renderErrorResponse(ServerRequest serverRequest) {
    Throwable throwable = (Throwable) serverRequest
        .attribute("org.springframework.boot.web.reactive.error.DefaultErrorAttributes.ERROR")
        .orElseThrow(
            () -> new IllegalStateException("Missing exception attribute in ServerWebExchange"));

    if (throwable.getMessage().equals("404 NOT_FOUND \"No matching handler\"")) {
      return ServerResponse.status(HttpStatus.BAD_REQUEST).contentType(MediaType.APPLICATION_JSON)
          .body(Mono.just("Requested resource wasn't found on the server"), String.class);
    } else {
      return ServerResponse.status(HttpStatus.BAD_REQUEST).contentType(MediaType.APPLICATION_JSON)
          .body(Mono.just("Some Error happened"), String.class);
    }
  }

}

Создать бин из этого класса:

@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
@ConditionalOnClass(WebFluxConfigurer.class)
@AutoConfigureBefore(ErrorWebFluxAutoConfiguration.class)
public class Beans {

  @Bean
  @Order(-1)
  public CustomErrorWebExceptionHandler modelMapper(ErrorAttributes errorAttributes,
      ResourceProperties resourceProperties,
      ApplicationContext applicationContext, ServerCodecConfigurer serverCodecConfigurer,
      ObjectProvider<ViewResolver> viewResolvers) {

    CustomErrorWebExceptionHandler customErrorWebExceptionHandler = new CustomErrorWebExceptionHandler(
        errorAttributes, resourceProperties,
        applicationContext);

    customErrorWebExceptionHandler
        .setViewResolvers(viewResolvers.orderedStream().collect(Collectors.toList()));
    customErrorWebExceptionHandler.setMessageWriters(serverCodecConfigurer.getWriters());
    customErrorWebExceptionHandler.setMessageReaders(serverCodecConfigurer.getReaders());

    return customErrorWebExceptionHandler;
  }
}

application.properties:

server.error.whitelabel.enabled=false
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false

Этот ответ StackOverflow был полезен. { ссылка }

...