所以我想实现保存用户的功能,首先我检查用户是否存在,如果存在则抛出异常,否则保存用户但是当我从服务层抛出异常时 .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 或其他相关内容