首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以正确的方式处理和返回Mono错误- Java Reactor代码

以正确的方式处理和返回Mono错误- Java Reactor代码
EN

Stack Overflow用户
提问于 2021-05-11 21:35:35
回答 1查看 106关注 0票数 1

我有一个DTO类,如下所示:

代码语言:javascript
复制
public class User {

    @Field("id")
    private String id;

    private String userName;

    private String emailId;
}

我必须通过API提供更新和删除功能。

我写了以下代码来删除记录:

代码语言:javascript
复制
public Mono<String> userData(User body) {

    repo.removeUserDetails(userObj).subscribe(); 
     return Mono.just("Remove Successful");
 
}

RemoveUserDetails方法类似于:

代码语言:javascript
复制
 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代码,所以不知道如何编写它。

EN

回答 1

Stack Overflow用户

发布于 2021-05-12 02:47:57

无论何时调用subscribe,都可以认为这是一个即时的危险信号。订阅应该由您正在使用的框架(在本例中为Webflux)处理。

如果您自己订阅,如下例所示:

代码语言:javascript
复制
public Mono<String> userData(User body) {
    repo.removeUserDetails(userObj).subscribe(); 
    return Mono.just("Remove Successful");
 
}

实际上,您已经创建了一个“即发即忘”类型的订阅,在这种订阅中,您无法知道发布者是否成功完成、是否导致错误、完成花费了多长时间、是否完成,或者是否发出了元素。因此,在本例中,您说的是“发送一个删除用户详细信息的请求,忘记它是您发送的,然后在等待任何类型的结果之前,始终返回‘删除成功’。”这几乎不是你想要的。

你可以使用类似这样的东西:

代码语言:javascript
复制
public Mono<String> userData(User body) {
    return repo.removeUserDetails(userObj)
               .then(Mono.just("Remove Successful"));
}

...which要好得多,因为它将所有内容都包含在反应链中。在这种情况下,你要么得到一个错误信号,要么得到“删除成功”。

但是,您可能根本不需要返回该字符串-您只需要知道它是否成功。这样做的标准方法(我只需要知道它是否成功完成,我不需要它返回值)是使用Mono<Void>作为返回类型和then(),类似于:

代码语言:javascript
复制
public Mono<Void> userData(User body) {
    return repo.removeUserDetails(userObj).then();
}

如果删除成功,...which会给你一个标准的完成,否则会给你一个错误信号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67487903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档