gpt4 book ai didi

java - Spring webflux 中处理条件响应的正确方法是什么

转载 作者:行者123 更新时间:2023-12-02 08:42:07 26 4
gpt4 key购买 nike

我刚刚开始学习 Spring Web Flux。并且对于如何做到这一点有完全的改变或观点采用响应式(Reactive)编程而不是命令式编程。

所以,我想实现一个非常简单的输出。

我有包含成功、消息和列表数据字段的响应类。

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

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

和一个Request类

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

private String email;
private String password;
}

我还有带有 webFlux 的 userRepository。

Mono<User> findUserByEmail(String email);

我有一个像这样的登录操作。

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

现在我必须根据 userRepository 给我的内容返回响应。

  • 如果没有用户存在,它可能返回 null
  • 如果找到用户,它可以给我 User 类对象
  • 现在我必须检查密码是否与 LoginRequest 中给出的密码匹配

所以我必须根据用户存储库更改响应就像找不到用户一样

  • 我必须返回成功 = false 和消息 =“未找到用户”的响应如果发现用户密码无效
  • 我必须返回成功 = false 和消息 =“无效密码”的响应如果一切顺利的话
  • 我必须返回 success = true 、 message = "Welcome"以及包含用户名、电子邮件等的列表

我尝试了很多方法,但最终还是没能实现。

最佳答案

您不需要 Mono 作为 Controller 的参数,您可以接受来自 Spring 的标准数据绑定(bind)后的值。检查 Spring 文档以获取示例:https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#webflux-controller

您也不应该从存储库中获取 null,如果找不到用户,您将得到一个空的 Mono(因此 .map.filter等不会被调用)。既然如此,您可以使用 .switchIfEmpty 来替代 null 检查。

如果您获得数据,您可以简单地将其 .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())));
}

关于java - Spring webflux 中处理条件响应的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61316230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com