所以我想实现保存用户的功能首先我检查用户是否存在如果存在抛出异常否则保存用户但是当我从服务层抛出异常时.flatMap(user -> Mono.error(new IllegalArgumentException("User Exists with email " + user.getEmail())))
@Service
@RequiredArgsConstructor
public class AppUserService {
private final AppUserRepository appUserRepository;
public Flux<AppUser> getAllUsers() {
return appUserRepository.findAll();
}
public Mono<AppUser> saveUser(AppUser appUser) {
return getUser(appUser.getEmail())
.flatMap(user -> Mono.error(new IllegalArgumentException("User Exists with email " + user.getEmail())))
.switchIfEmpty(Mono.defer(() -> appUserRepository.save(appUser))).cast(AppUser.class).log();
}
public Mono<AppUser> getUser(String email) {
return appUserRepository.findFirstByEmail(email);
}
}
并且在控制器层中,如果我像这样处理它.onErrorResume(error -> ServerResponse.badRequest().bodyValue(error))
@RestController
@RequiredArgsConstructor
@RequestMapping("/user")
public class AppUserController {
private final AppUserService appUserService;
private final PasswordEncoder encoder;
@GetMapping
public Flux<AppUser> getAllUsers(@RequestHeader("email") String email) {
return appUserService.getAllUsers();
}
@PostMapping
@CrossOrigin
public Mono<ResponseEntity<Object>> saveUser(@RequestBody Mono<AppUser> appUserMono) {
return appUserMono
.doOnSuccess(appUser -> appUser.setPassword(encoder.encode(appUser.getPassword())))
.subscribeOn(Schedulers.parallel())
.flatMap(appUserService::saveUser)
.flatMap(savedAppUser -> ResponseEntity.created(URI.create("/user/" + savedAppUser.getId())).build())
.onErrorResume(error -> Response entity.badRequest().bodyValue(error))
.log();
}
}
它在控制台上引发错误
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.springframework.web.reactive.function.server.DefaultEntityResponseBuilder$DefaultEntityResponse and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
并返回 200 给客户端
我究竟做错了什么
阅读错误后,它似乎得到了一个空值,但是如果我在onErrorResume(error -> ..)
错误变量处调试流程有错误无法理解为什么它仍然抛出杰克逊错误是因为杰克逊无法订阅 ServerResponse 或周围的东西