我正在使用Spring webflux开发reactive streams应用程序。我有一个用例,我做了一个webclient请求来获取一些数据,一旦我获得了响应数据,我就验证它,如果验证失败,我想抛出一个异常,这个异常应该由main
reactive管道来处理。我在平面地图中使用webclient调用,以便在管道的下一个运算符中使用该值。我的代码类似于下面的代码。
public class Example {
pubic String getData(String name) {
return Mono.just(name)
.map(name -> name.toLowerCase())
.flatMap(name ->
// Webclient Request that returns a
// Mono<String> for example
.doOnSuccess(Validator::validateData); // The webclient request is chained to this doOnSuccess
)
.doOnError(ex -> log.error("Got an error, {}", er))
.onErrorMap(ex -> new AnotherCustomException(ex.getMessage()));
}
}
public class Validator {
public void validateData(String data) {
if(data.length() < 5) throw new CustomException("Invalid data received."); // public CustomException extends RuntimeException {...}
}
}
目前,这段代码没有使用doOnError()
& onErrorMap()
操作符,我直接在我的控制台上接收CustomException
堆栈跟踪。我认为原因是flatMap
内部的代码本身是一个发布者Mono
,所以它应该有自己的doOnError()
,onErrorMap()
运算符。如何使此the客户端的响应(即Mono<String>
)能够使用使用WebClient
的main
管道
发布于 2021-09-20 21:24:44
这就是你想要的
SomeWebclientCall().flatMap(value -> {
Validate.validate(value);
return Mono.just(value);
});
这看起来可能很奇怪,这是因为编写返回void
或异常的空函数是奇怪的,应该避免。
这样的函数是无效的(抛出异常代价很高,并且不应该是程序的自然流程),并且很难测试。
这就是为什么验证函数通常返回布尔值,因为它通过了验证,是或否,真或假。不是无效的或异常的。
函数式编程不喜欢空函数,只喜欢纯函数。
https://stackoverflow.com/questions/69261989
复制相似问题