0

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

4

1 回答 1

1

您的代码中几乎没有问题。

以下是如何让它运行(没有存储库):

package test;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class AppUser {
  private String id;

  private String username;

  private String firstName;

  private String password;

  private String email;
}

@Service
@RequiredArgsConstructor
public class AppUserService {

  public Mono<AppUser> saveUser(AppUser appUser) {
    return getUser(appUser.getEmail())
        .flatMap(user -> Mono.<AppUser>error(
            new IllegalArgumentException("User Exists with email " + user.getEmail())))
        .switchIfEmpty(Mono.defer(() -> Mono.just(AppUser.builder().username("mustafa").build())));
  }

  public Mono<AppUser> getUser(String email) {
//    return Mono.defer(() -> Mono.just(AppUser.builder().email(email).build()));
    return Mono.defer(Mono::empty);
  }
}
@RestController
@RequiredArgsConstructor
@RequestMapping("/user")
public class AppUserController {

  private final AppUserService appUserService;

  @PostMapping
  @CrossOrigin
  public Mono<ResponseEntity<AppUser>> saveUser(@RequestBody Mono<AppUser> appUserMono,
                                                @RequestHeader("email") String email) {
    return appUserMono
        .subscribeOn(Schedulers.parallel())
        .flatMap(appUserService::saveUser)
        .flatMap(savedAppUser -> Mono.just(
            ResponseEntity.created(URI.create("/user/" + savedAppUser.getId())).body(savedAppUser)))
        .onErrorResume(error -> Mono.just(ResponseEntity.badRequest().build()))
        .log();
  }
}

您的控制器的返回类型是Mono<ResponseEntity<AppUser>>但是您正在返回ServerResponse。我解决了这个问题并从您的服务代码中删除了演员表。

getUser您可以通过注释/取消注释正文来尝试生成 400 或有效结果。

编写电子邮件检查逻辑的更清晰的方法可能是使用旧的 if/else 语句:

  public Mono<AppUser> saveUser(AppUser appUser) {
    if (emailExists(appUser.getEmail())) {
      return Mono.error(new IllegalArgumentException("User Exists with email "
          + appUser.getEmail()));
    } else {
      return Mono.just(AppUser.builder().username("mustafa").build());
    }
  }
于 2021-09-04T16:48:48.913 回答