当前位置: 首页 > 知识库问答 >
问题:

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

佴阳辉
2023-03-14

我有这样一门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代码还不熟悉,所以不知道怎么写。

共有1个答案

东郭鹤龄
2023-03-14

每当你订阅订阅时,都认为它是立即的红旗。订阅应该由您正在使用的框架来处理(本例中是Webflux)

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

public Mono<String> userData(User body) {
    repo.removeUserDetails(userObj).subscribe(); 
    return Mono.just("Remove Successful");
 
}

...然后,您基本上创建了一个“fire and forget”类型的订阅,您无法知道该发布服务器是否成功完成,是否导致了错误,完成所需的时间,是否完成,或者是否发出了元素。因此,在本例中,您的意思是“发送一个删除用户详细信息的请求,忘记您发送了它,然后在等待任何类型的结果之前,始终返回‘删除成功’。”这几乎不是你想要的。

你可以使用以下方法:

public Mono<String> userData(User body) {
    return repo.removeUserDetails(userObj)
               .then(Mono.just("Remove Successful"));
}

...这是更好的,因为它包括一切作为反应链的一部分。在这种情况下,您要么会得到一个错误信号,要么会得到“删除成功”。

然而,很可能你根本不需要返回这个字符串——你只需要知道它是否成功。这样做的标准方法(我只需要知道它是否成功完成,我不需要它返回值)是使用Mono

public Mono<Void> userData(User body) {
    return repo.removeUserDetails(userObj).then();
}

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

 类似资料:
  • 我正在使用JBoss6.1、Spring3.2、hibernate验证以及最近启用的CORS支持。请求与GET方法配合良好。如果使用请求方法POST,我希望控制器返回405。但我得到的是http状态码400。我在jboss日志中启用了跟踪,发现spring返回了错误的处理程序。应用程序只有一个控制器接受POST请求方法,其余控制器定义为只接受GET方法。每当使用POST请求方法对这些控制器(用GE

  • 我有一个很长的方法,其中包含一堆将返回当我们发现无效对象时。 如何生成和提取这些验证代码。错误我已经尝试了以下方法,但它警告我需要指定

  • 如何正确处理由期货构建的Monos? 我试着让我的头脑围绕着Spring Reactive(和Spring 5),观看所有的视频,阅读所有我能找到的博客,但他们似乎都没有做一些事情,而不仅仅是查询数据库或其他琐碎的事情。 我正在使用新的AWS 2.0开发工具包,它使用的用于大多数事情。使用服务创建新实例,我的方法如下所示 我在这里的理解是,我几乎立即返回类型的,而将随时执行它的操作。 我从我的路由

  • 我们有一个Hystrix(1.4.x)命令如下所示(使用Spring): 实际上,我们不想从回退方法返回(空的),而是抛出一个异常,以便的调用方知道已关闭,并可以相应地执行操作。但同时我们希望利用Hystrix提供的功能。 在我们的例子中,我们希望调用方返回一个错误消息,而不是返回一个列表。在Spring中实现了一个后退,如下所示: 从引发异常“有效”,但Hystrix将警告我们: Command

  • 问题内容: 我使用Jenkins(在Windows计算机上)作业通过Ant为不同的目标编译一些代码。为此,我将对ant目标的调用包装在(windows)批处理循环中,如下所示: 那是我的第一个主意……但是即使(例如)target1失败,此代码也可以成功构建。因此,我在Windows批处理构建步骤中增加了一些内容,以获取更多概述。另外,我还用了cecekdout代码来获得与Jenkins本地计算机相

  • 目前,我正在抛出以返回GraphQL验证错误。它工作得出奇的好,除了在我的日志中用大堆栈跟踪抛出可怕的错误。 在这里,您可以看到我正在检查提交的新用户注册突变,以确保密码相互匹配,并且电子邮件地址尚未使用。 在GraphQL SPQR Spring Boot Starter中,正确的方法是什么。