在响应式Java应用程序中使用Mono和仅仅使用ReturnType有什么好处/缺点吗?
如果你只是做数据验证,使用Mono是否有意义
为例:选项1
public Mono<String> createEmployee(String name, String dept, String age){
Employee e;
try {
e = new Employee(name, dept, age);
} catch ( ValidationException ve){
logger.error("Invalid inputs: ", ve);
return Mono.error(ve);
}
return DBUtils.createEmployee(e).flatMap(
e -> {
return Mono.just(e.getId());
}
);
}
选项2
public Mono<String> createEmployee(String name, String dept, String age){
return Mono.just(new Employee(name, dept, age))
.flatMap(e -> DBUtils.createEmployee(e))
.flatMap(e -> Mono.just(e.getId())
.onErrorResume(e -> Mono.just("Invalid Inputs"));
}
是否有这样的规则,如果没有IO操作不使用Mono?
如果你只是做数据验证,使用Mono是否有意义
不,除非验证可能以某种方式涉及阻塞操作(如将数据发送到服务器进行验证),在这种情况下,它是有意义的。在这里,虽然它看起来就像你在一个标准方法中处理一些逻辑,没有阻塞操作,如API调用。
然而,在你的例子中,你做的不仅仅是验证-看起来你实际上是将员工保存到数据库(我假设这就是DBUtils.createEmployee(e)
所做的)-在这种情况下,使用Mono
是完全有意义的,因为这是一个教科书用例(允许你采取传统的阻塞操作,而不是使其成为反应链的一部分。)
因此,假设以上是正确的,那么选项2确实有意义-但它当然可以根据两个特定的指导原则简化:
- 使用
flatMap()
是没有意义的,除非你的操作实际上返回一个发布者-否则就使用map()
代替; - 创建POJO,将其包装在
Mono
中然后映射它是没有意义的-只需将发布者作为链中的第一个元素开始即可。
所以比起你的选项2,最好是这样写:
return DBUtils.createEmployee(new Employee(name, dept, age))
.map(Employee::getId)
.onErrorResume(e -> Mono.just("Invalid Inputs"));