与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层。
尝试使用钩子。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编程语言的语义,并且在初始化类或接口之前已对其进行了完全验证和准备,并且在链接过程中检测到的错误被抛出到程序中某个位置,在该位置程序执行了一些可能需要链接到错误所涉及的类或接
我的Spring安全配置: 自定义处理程序: 异常解析器: 我的问题是spring security不会抛出任何异常。例如,当我输入一个受保护的url时,它会将我重定向到登录页面。如果我从配置中删除登录页面,它会将我重定向到spring security默认登录表单。因此,我不能处理任何异常,如AccessDeniedException。正如你在上面看到的,我已经定义了自定义的拒绝访问处理程序,它
问题内容: 我正在android中做一个应用程序,因此我需要访问com.android.internal.telephony API。现在,我可以访问这些API了,但问题是,无论我在自己的类中调用Class Call.java方法的什么地方,都会抛出。您可以在http://hi- android.info/src/com/android/internal/telephony/Call.java.h
我正试图用Java开发一个卡片验证程序。方法基本上检查给定的卡号是否有效。我在那里指定了一个条件,该条件应该抛出一个,但它没有 以下是我的Java文件:- 现在,下面的代码片段应该抛出提到的,不是吗,因为我故意从我的main向方法提供无效的参数? 下面是我在控制台中得到的输出