如果不存在,单声道继续
Mono continue if not present
给定两个会话(A 和 B)作为字符串,我的目标是检查 A 在数据库中是否有效。如果 A 存在,则 return 它。如果没有提供A(或数据库中不存在),我想继续检查数据库中的会话B。
我下面的代码的问题是我 return 不管是否找到 A。相反,我想检查如果找不到 A(为空),则继续检查 B。有没有办法检查 Mono 是否 not 存在?
String sessionA = "1";
String sessionB = "2";
public Mono<Session> getSession() {
if (!StringUtils.isEmpty(sessionA)) {
return myDatabaseService.findByKeyOne(sessionA); // Should only return if it exists, otherwise, check session B
}
if (!StringUtils.isEmpty(sessionB)) {
return myDatabaseService.findByAnotherSession(sessionB);
}
throw new Exception(); // If both sessions have not been found
}
// My Database Service (dummy code)
public Mono<Session> findByKeyOne(String session) {
try {
return myDatabase.find();
} catch (Exception e) {
return Mono.empty() // If an error occurrd or no result has been found, return empty
}
}
这很简单:
myDatabaseService.findByKeyOne(sessionA)
.switchIfEmpty(myDatabaseService.findByAnotherSession(sessionB))
现在您只需检查您的可空性
扩展@Eugene Botyanovsky 的回答,解决可选的 sessionA,您可以尝试这样的事情:
// Return an exception in case both sessionA and sessionB are empty.
if (StringUtils.isEmpty(sessionA) && StringUtils.isEmpty(sessionB)) {
return Mono.error(new Exception());
}
// simply return an empty Mono if sessionA is empty.
Mono<Session> sessionAMono = StringUtils.isEmpty(sessionA)
? Mono.empty()
: myDatabaseService.findByKeyOne(sessionA);
return sessionAMono
.switchIfEmpty(Mono.defer(() -> myDatabaseService.findByAnotherSession(sessionB)));
在这种情况下,两种情况下 sessionA 为空,以及 myDatabaseService.findByKeyOne(sessionA)
returns 一个空结果(假设它确实如此)。
编辑:
与您的关注无关,但我想在您的 findByKeyOne
函数中指出,因为 myDatabase.find()
正在返回一个 Mono,所以用 try catch 包装它是行不通的,因为它是异步的。这意味着您需要处理同一流中的任何潜在错误。你可以这样做:
return myDatabase.find()
.onErrorResume(throwable -> Mono.empty();
给定两个会话(A 和 B)作为字符串,我的目标是检查 A 在数据库中是否有效。如果 A 存在,则 return 它。如果没有提供A(或数据库中不存在),我想继续检查数据库中的会话B。
我下面的代码的问题是我 return 不管是否找到 A。相反,我想检查如果找不到 A(为空),则继续检查 B。有没有办法检查 Mono 是否 not 存在?
String sessionA = "1";
String sessionB = "2";
public Mono<Session> getSession() {
if (!StringUtils.isEmpty(sessionA)) {
return myDatabaseService.findByKeyOne(sessionA); // Should only return if it exists, otherwise, check session B
}
if (!StringUtils.isEmpty(sessionB)) {
return myDatabaseService.findByAnotherSession(sessionB);
}
throw new Exception(); // If both sessions have not been found
}
// My Database Service (dummy code)
public Mono<Session> findByKeyOne(String session) {
try {
return myDatabase.find();
} catch (Exception e) {
return Mono.empty() // If an error occurrd or no result has been found, return empty
}
}
这很简单:
myDatabaseService.findByKeyOne(sessionA)
.switchIfEmpty(myDatabaseService.findByAnotherSession(sessionB))
现在您只需检查您的可空性
扩展@Eugene Botyanovsky 的回答,解决可选的 sessionA,您可以尝试这样的事情:
// Return an exception in case both sessionA and sessionB are empty.
if (StringUtils.isEmpty(sessionA) && StringUtils.isEmpty(sessionB)) {
return Mono.error(new Exception());
}
// simply return an empty Mono if sessionA is empty.
Mono<Session> sessionAMono = StringUtils.isEmpty(sessionA)
? Mono.empty()
: myDatabaseService.findByKeyOne(sessionA);
return sessionAMono
.switchIfEmpty(Mono.defer(() -> myDatabaseService.findByAnotherSession(sessionB)));
在这种情况下,两种情况下 sessionA 为空,以及 myDatabaseService.findByKeyOne(sessionA)
returns 一个空结果(假设它确实如此)。
编辑:
与您的关注无关,但我想在您的 findByKeyOne
函数中指出,因为 myDatabase.find()
正在返回一个 Mono,所以用 try catch 包装它是行不通的,因为它是异步的。这意味着您需要处理同一流中的任何潜在错误。你可以这样做:
return myDatabase.find()
.onErrorResume(throwable -> Mono.empty();