我一直在使用spring-webflux进行一些研究,我喜欢了解使用路由器功能处理错误的正确方法.
我已经创建了一个小项目来测试几个场景,我希望得到关于它的反馈,看看其他人在做什么.
到目前为止我所做的是.
提供以下路由功能:
@Component
public class HelloRouter {
@Bean
RouterFunction<?> helloRouterFunction() {
HelloHandler handler = new HelloHandler();
ErrorHandler error = new ErrorHandler();
return nest(path("/hello"),
nest(accept(APPLICATION_JSON),
route(GET("/"), handler::defaultHello)
.andRoute(POST("/"), handler::postHello)
.andRoute(GET("/{name}"), handler::getHello)
)).andOther(route(RequestPredicates.all(), error::notFound));
}
}
Run Code Online (Sandbox Code Playgroud)
我在我的经纪人身上这样做了
class HelloHandler {
private ErrorHandler error;
private static final String DEFAULT_VALUE = "world";
HelloHandler() {
error = new ErrorHandler();
}
private Mono<ServerResponse> getResponse(String value) {
if (value.equals("")) {
return Mono.error(new InvalidParametersException("bad parameters"));
}
return ServerResponse.ok().body(Mono.just(new HelloResponse(value)), HelloResponse.class);
}
Mono<ServerResponse> defaultHello(ServerRequest request) {
return …Run Code Online (Sandbox Code Playgroud) 在这篇文章的帮助下,我通过 custom 在 Spring 5 WebFlux 应用程序中获得了部分异常处理工作WebExceptionHandler,但是当我想将友好消息中的现有异常转换为客户端时,它不起作用。
我的自定义 WebExceptionHandler 如下所示,完整代码在这里。
WebExchangeBindException cvex = (WebExchangeBindException) ex;
Map<String, String> errors = new HashMap<>();
log.debug("errors:" + cvex.getFieldErrors());
cvex.getFieldErrors().forEach(ev -> errors.put(ev.getField(), ev.getDefaultMessage()));
log.debug("handled errors::" + errors);
try {
DataBuffer db = new DefaultDataBufferFactory().wrap(objectMapper.writeValueAsBytes(errors));
exchange.getResponse().setStatusCode(HttpStatus.UNPROCESSABLE_ENTITY);
exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8);
exchange.getResponse().writeWith(Mono.just(db));
return exchange.getResponse().setComplete();
} catch (JsonProcessingException e) {
e.printStackTrace();
return Mono.empty();
}
Run Code Online (Sandbox Code Playgroud)
状态码设置正确,但响应内容长度为 0。