我有一个DTO类,如下所示:
public class User {
@Field("id")
private String id;
private String userName;
private String emailId;
}我必须通过API提供更新和删除功能。
我写了以下代码来删除记录:
public Mono<String> userData(User body) {
repo.removeUserDetails(userObj).subscribe();
return Mono.just("Remove Successful");
}RemoveUserDetails方法类似于:
public Mono<User> removeUserDetails(User userObj) {
return findByUsername(userObj.getUsername())
.flatMap(existingUser -> {
// logic to delete the data from database which working as expected
}).switchIfEmpty(
Mono.defer(() -> {
return Mono.error(new Exception("User Name " + userObj.getUsername() + " doesn't exist."));
})
);
}这段代码的问题是,即使用户不存在,它也不会显示我返回的Mono错误。在任何情况下,这总是返回"Remove Successful“。
如何更改我的服务层方法,使其能够返回repo方法收到的任何内容?我刚接触Reactor代码,所以不知道如何编写它。
发布于 2021-05-12 02:47:57
无论何时调用subscribe,都可以认为这是一个即时的危险信号。订阅应该由您正在使用的框架(在本例中为Webflux)处理。
如果您自己订阅,如下例所示:
public Mono<String> userData(User body) {
repo.removeUserDetails(userObj).subscribe();
return Mono.just("Remove Successful");
}实际上,您已经创建了一个“即发即忘”类型的订阅,在这种订阅中,您无法知道发布者是否成功完成、是否导致错误、完成花费了多长时间、是否完成,或者是否发出了元素。因此,在本例中,您说的是“发送一个删除用户详细信息的请求,忘记它是您发送的,然后在等待任何类型的结果之前,始终返回‘删除成功’。”这几乎不是你想要的。
你可以使用类似这样的东西:
public Mono<String> userData(User body) {
return repo.removeUserDetails(userObj)
.then(Mono.just("Remove Successful"));
}...which要好得多,因为它将所有内容都包含在反应链中。在这种情况下,你要么得到一个错误信号,要么得到“删除成功”。
但是,您可能根本不需要返回该字符串-您只需要知道它是否成功。这样做的标准方法(我只需要知道它是否成功完成,我不需要它返回值)是使用Mono<Void>作为返回类型和then(),类似于:
public Mono<Void> userData(User body) {
return repo.removeUserDetails(userObj).then();
}如果删除成功,...which会给你一个标准的完成,否则会给你一个错误信号。
https://stackoverflow.com/questions/67487903
复制相似问题