Как правильно обращаться с условным ответом в Spring webflux? - PullRequest
0 голосов
/ 20 апреля 2020

Я только начал изучать весенний веб-поток. и есть полное изменение или перспектива того, как выполнять работу в реактивном программировании вместо императивного программирования.

Итак, я хотел бы получить очень простой вывод.

У меня есть класс ответа с поля success, message и List data.

@Data
@Accessors(chain = true)
public class Response {

    private boolean success;
    private String message;
    private List data;
}

и класс запросов

@Data
@Accessors(chain = true)
public class LoginRequest {

    private String email;
    private String password;
}

У меня также есть userRepository с webFlux.

Mono<User> findUserByEmail(String email);

и у меня есть действие входа в систему, подобное этому.

@PostMapping("/login")
public Mono<Response> login(@RequestBody Mono<LoginRequest> request) {
}

Теперь я должен вернуть ответ, основываясь на том, что дал мне userRepository.

  • Он может вернуть ноль, если ни один пользователь не присутствует
  • Это может дать мне объект класса User, если пользователь найден
  • Теперь я должен проверить, совпадает ли пароль с паролем, указанным в LoginRequest

Так что я должен изменить ответ в зависимости от пользователя хранилище, например, если пользователь не найден

  • Я должен вернуть ответ с успехом = false и сообщением = "Пользователь не найден", если пользователь найден с неверным паролем
  • Я должен вернуть ответ с SUC cess = false и message = "неверный пароль", и если все хорошо, тогда
  • Я должен вернуть success = true, message = "Welcome" и список с именем пользователя, адресом электронной почты и т. д. c.

Я перепробовал много способов, но в конце концов мне это не удалось.

1 Ответ

1 голос
/ 20 апреля 2020

Вам не нужен Mono в качестве аргумента для вашего контроллера, вы можете принять значение после стандартного связывания данных из Spring. Посмотрите документы Spring для примеров: https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux -контроллер

Вы также не должны получать нулевое значение из своего репо, если пользователь не может быть найден, вы получите пустой Mono (поэтому .map, .filter, et c не будут называться). В этом случае вы можете использовать .switchIfEmpty в качестве замены для нулевой проверки.

Если вы получаете данные, вы можете просто .map получить то, что вам нужно, так как вам не нужно блокировать другие данные :

public Mono<Response> login(LoginRequest request) {
        return repo.findUserByEmail(request.getEmail())
            .map(user ->
                Objects.equals(request.getPassword(), user.getPassword())
                    ? new Response(true, "Welcome", Collections.emptyList())//populate list here
                    : new Response(false, "invalid password", Collections.emptyList()))
            //user wasn't found in the repo
            .switchIfEmpty(Mono.just(new Response(false, "No user found", Collections.emptyList())));
    }
...