Java SpringWebFlux中单声道序列的奇怪执行
我有一个场景,我在Mono序列中调用一个方法,根据调用序列的方式,我要么得到一个错误,要么序列成功 成功序列:Java SpringWebFlux中单声道序列的奇怪执行,java,spring,spring-boot,spring-webflux,project-reactor,Java,Spring,Spring Boot,Spring Webflux,Project Reactor,我有一个场景,我在Mono序列中调用一个方法,根据调用序列的方式,我要么得到一个错误,要么序列成功 成功序列: @Override public Mono<User> getUserDetails(String userId) { return reactiveValueOps .get(userId) .switchIfEmpty(userService.getUser(Long.valueOf(use
@Override
public Mono<User> getUserDetails(String userId) {
return reactiveValueOps
.get(userId)
.switchIfEmpty(userService.getUser(Long.valueOf(userId))
.flatMap(this::setUserDetails));
}
@Override
public Mono<User> setUserDetails(User user) {
return reactiveValueOps
.set(String.valueOf(user.getId()), user, Duration.ofDays(SESSION_PERSISTENCE_DURATION))
.flatMap(b -> Mono.just(user));
}
@Override
public Mono<User> getUserDetails(String userId) {
return reactiveValueOps
.get(userId)
.switchIfEmpty(Mono.defer(() -> {
Mono<User> user = userService.getUser(Long.valueOf(userId));
Mono<Boolean> valueSet = setUserDetails(user);
return valueSet.zipWith(user, (v, u) -> u);
}));
}
@Override
public Mono<Boolean> setUserDetails(Mono<User> user) {
return user.switchIfEmpty(Mono.defer(() ->
Mono.error(new UnsupportedOperationException("Cannot persist empty User Object"))))
.flatMap(u -> reactiveValueOps.set(String.valueOf(u.getId()), u, Duration.ofDays(1L)));
}
@覆盖
公共Mono getUserDetails(字符串用户ID){
返回反应值操作
.get(用户ID)
.switchIfEmpty(userService.getUser(Long.valueOf(userId))
.flatMap(this::setUserDetails));
}
@凌驾
公共Mono setUserDetails(用户){
返回反应值操作
.set(String.valueOf(user.getId()),user,Duration.ofDays(SESSION\u PERSISTENCE\u Duration))
.flatMap(b->Mono.just(用户));
}
错误顺序:
@Override
public Mono<User> getUserDetails(String userId) {
return reactiveValueOps
.get(userId)
.switchIfEmpty(userService.getUser(Long.valueOf(userId))
.flatMap(this::setUserDetails));
}
@Override
public Mono<User> setUserDetails(User user) {
return reactiveValueOps
.set(String.valueOf(user.getId()), user, Duration.ofDays(SESSION_PERSISTENCE_DURATION))
.flatMap(b -> Mono.just(user));
}
@Override
public Mono<User> getUserDetails(String userId) {
return reactiveValueOps
.get(userId)
.switchIfEmpty(Mono.defer(() -> {
Mono<User> user = userService.getUser(Long.valueOf(userId));
Mono<Boolean> valueSet = setUserDetails(user);
return valueSet.zipWith(user, (v, u) -> u);
}));
}
@Override
public Mono<Boolean> setUserDetails(Mono<User> user) {
return user.switchIfEmpty(Mono.defer(() ->
Mono.error(new UnsupportedOperationException("Cannot persist empty User Object"))))
.flatMap(u -> reactiveValueOps.set(String.valueOf(u.getId()), u, Duration.ofDays(1L)));
}
@覆盖
公共Mono getUserDetails(字符串用户ID){
返回反应值操作
.get(用户ID)
.switchIfEmpty(单声道延迟)(()->{
Mono user=userService.getUser(Long.valueOf(userId));
Mono valueSet=setUserDetails(用户);
返回值集.zipWith(用户,(v,u)->u);
}));
}
@凌驾
公共Mono setUserDetails(Mono用户){
返回user.switchIfEmpty(Mono.defer)(()->
Mono.error(新的UnsupportedOperationException(“无法持久化空用户对象”))
.flatMap(u->reactiveValueOps.set(String.valueOf(u.getId()),u,Duration.ofDays(1L));
}
userService.getUser
方法要么从DB返回用户,要么创建一个从第三方API获取详细信息的新用户,在第二个序列中,我得到以下错误:
错误:重复的键值违反了唯一约束
仅当用户尚未出现在数据库中时,才会发生此错误;如果用户未出现在数据库中,则不会出现问题,并且仅针对第二个执行流。
当我使用
zipWith
时,是否发生了错误?此处是否需要一些额外的或被剪断的代码?此处是否需要一些额外的或被剪断的代码?