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

如果不是空的,spring rector会抛出异常

籍光熙
2023-03-14

与Spring Reactor类似:当publisher发出值时,如何引发异常?

我在DAOjava findSomePojo中有一个finder方法,它返回结果SomePojo。finder调用amazon db API和Java软件。亚马逊。awssdk。服务。dynamodb。模型GetItemResponse具有调用的输出。所以我在我的服务层createSomePojo方法中尝试这个hasElement()检查。(不确定我是否正确使用了它-我正在尝试和调试)

基本上:我想检查是否已经存在元素,保存是非法的,我不会调用DAOs save。所以我需要抛出异常。

假设在DB中已经有了某个Pojo的记录,我尝试调用服务create_SomePjo。但是我在日志中看到过滤器不工作,当Reactor调用时得到NPEcreateModel_SomePojo让我相信,即使在检查过滤器之后,它也会抛出NPE

///service SomePjoService it has create_SomePojo, find_SomePojo etc

Mono<Void>  create_SomePojo(reqPojo){

// Before calling DAO 's save I call serivice find (which basically calls DAOs find (Shown befow after this methid)
       Mono<Boolean> monoPresent = find_SomePojo(accountId, contentIdExtn)
                 .filter(i -> i.getId() != null)
                 .hasElement();
       System.out.println("monoPresent="+monoPresent.toString());
       if(monoPresent.toString().equals("MonoHasElement")){
       //*************it comes here i see that***********//
           System.out.println("hrereee monoPresent="+monoPresent);
          // Mono<Error> monoCheck=
                return  monoPresent.handle((next, sink) -> sink.error(new SomeException(ITEM_ALREADY_EXISTS))).then();
       } else {
           return SomePojoRepo.save(reqPojo).then();
       }

}

Mono<SomePojo> find_SomePojo(id){
    return SomePojoRepo.find(id);
}

==============================================================

///DAO : SomePojoRepo.java : it has save,find,delete
Mono<SomePojo> find( String id) {
    Mono<SomePojo> fallback = Mono.empty();
    Mono<GetItemResponse> monoFilteredResponse = monoFuture
        .filter(getItemResponse -> getItemResponse.item().size() > 0&& getItemResponse!=null);
    Mono<SomePojo> result = monoFilteredResponse
        .html" target="_blank">map(getItemResponse -> createModel_SomePojo(getItemResponse.item()));

    Mono<SomePojo> deferedResult = Mono.defer(() -> result.switchIfEmpty(fallback));
        return deferedResult;
}

我看到Mono上有hasElement()方法。不知道如何正确使用它。如果我在我的服务中直接调用DAO save create_SomePojo(reqPojo),而不进行所有findner检查,我就可以实现异常,因为主键约束会处理并抛出exception,而我cna rethrow,然后在服务中捕获,但如果我想在服务中检查并抛出带有错误代码的异常,该怎么办。这样做的目的不是将响应错误对象传递给dao层。

共有1个答案

狄彬彬
2023-03-14

尝试使用钩子。onOperatorDebug()hook以获得更好的调试体验。

正确使用hasElement(假设find_SomePojo从不返回null)

Mono<Boolean> monoPresent =  find_SomePojo(accountId, contentIdExtn)
        .filter(i -> i.getId() != null)
        .hasElement();

return monoPresent.flatMap(isPresent -> {
    if(isPresent){
        Mono.error(new SomeException(ITEM_ALREADY_EXISTS)));
    }else{
        SomePojoRepo.save(reqPojo);
    }
}).then();

旁注

对于单声道实际上是什么,有一种常见的误解。它不保存任何数据——它只是管道的一部分,通过管道传输信号和数据。因此,行系统。出来println(“monpresent=”monpresent.toString())毫无意义,因为它只是在现有管道周围打印hasElements()装饰器。此装饰器的内部名称为MonoHasElement,无论其中包含什么(true/false),都会打印出MonoHasElement)。

打印信号(以及与之一起传输的数据)的正确方法是:Mono.log()Mono.doOnAll/Next(System.out::println)System.out.println(单呈现=单Present.block ()); .小心第三个:它会阻塞整个线程,直到数据被发出,所以只有当你知道你在做什么时才使用它。

使用Monos打印的示例

   Mono<String> abc = Mono.just("abc").delayElement(Duration.ofSeconds(99999999));

    System.out.println(abc); //this will print MonoDelayElement instantly
    System.out.println(abc.block()); //this will print 'abc', if you are patient enough ;^)
    abc.subscribe(System.out::println); //this will also print 'abc' after 99999999 seconds, but without blocking current thread

 类似资料:
  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 问题内容: 如果catch和finally块都抛出异常会怎样? 问题答案: 当该块引发异常时,它将有效地隐藏从该块引发的异常,并将最终引发该异常。因此,重要的是要么在捕获时记录异常,要么确保finally块本身不会引发异常,否则,您将得到被扼杀且从未见过的异常​​。

  • 问题内容: 考虑一下程序: 如果程序不带参数启动,则运行时类路径中是否需要Foo? 研究 报告链接错误时,Java语言规范相当模糊: 该规范为实现链接活动(以及由于递归,加载)的发生时间提供了实现上的灵活性,前提是尊重Java编程语言的语义,并且在初始化类或接口之前已对其进行了完全验证和准备,并且在链接过程中检测到的错误被抛出到程序中某个位置,在该位置程序执行了一些可能需要链接到错误所涉及的类或接

  • 问题内容: 我正在android中做一个应用程序,因此我需要访问com.android.internal.telephony API。现在,我可以访问这些API了,但问题是,无论我在自己的类中调用Class Call.java方法的什么地方,都会抛出。您可以在http://hi- android.info/src/com/android/internal/telephony/Call.java.h

  • 我的Spring安全配置: 自定义处理程序: 异常解析器: 我的问题是spring security不会抛出任何异常。例如,当我输入一个受保护的url时,它会将我重定向到登录页面。如果我从配置中删除登录页面,它会将我重定向到spring security默认登录表单。因此,我不能处理任何异常,如AccessDeniedException。正如你在上面看到的,我已经定义了自定义的拒绝访问处理程序,它

  • 我正试图用Java开发一个卡片验证程序。方法基本上检查给定的卡号是否有效。我在那里指定了一个条件,该条件应该抛出一个,但它没有 以下是我的Java文件:- 现在,下面的代码片段应该抛出提到的,不是吗,因为我故意从我的main向方法提供无效的参数? 下面是我在控制台中得到的输出