Вы можете создать свой собственный класс 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 был полезен. { ссылка }