java - Spring-Webflux:在没有 block() 的情况下从 Mono 中提取对象

标签 java spring rest spring-webflux project-reactor

我是新的 Spring Webflux。我正在编写一个简单的 api,它调用另一个 api 并返回响应。
我遇到的问题是我的 api 接受的请求类型与外部 api 不同。我必须将传入的请求转换为发送到外部 api。我正在使用 Mono 来接收对我的 api 的请求,但是在没有转换到另一个对象时遇到了麻烦堵塞()。
输入
路由器

@Configuration
@EnableWebFlux
public class RouterConfig implements WebFluxConfigurer{

    @Bean
    public RouterFunction<ServerResponse> routes(UserHandler handler){
        
        return RouterFunctions
                .route(POST("/rest/create"),
                        handler::createUser);
    }
    
} 
处理程序
@Component
public class UserHandler {

    private UserService service;

    public UserHandler(UserService service) {
    this.service = service;
    }

      
    public Mono<ServerResponse> saveUser(ServerRequest request) 
    {
    
        Mono<User> user = request.bodyToMono(User.class)
    
        /* currently I am using block to get User object */
    
         User user1 = user.block()
    
        /* convert user to person */
       
           Person p =getPersonFromUser(user);
    
       
    
        
    }
Pojos
 class User
    {
      private String name;
      private String id;
      private String email;
       private String phone;    
    
    
    }



 class Person
    {
      private String email;
      /* Combination of id and name */
      private String accountNumber;
      private String phone;
    
    }
有没有办法可以将 Mono 转换为 对象没有阻塞?

最佳答案

如果您愿意在 Mono-Lambda 中处理 Person p,那么您可以尝试

public Mono<ServerResponse> saveUser(ServerRequest request) 
{
    // Mono<User> user = request.bodyToMono(User.class)
    request.bodyToMono(User.class)

    // Convert a Mono<User> to a Mono<Person>    
    .map((User user1) -> getPersonFromUser(user))

    .map((Person p) -> {
        // Code that either returns ServerResponse object or an intermediary object
    })
    // Additional code as needed
因为 request.bodyToMono(User.class) 返回一个用户的 Mono,你可以调用那个 Mono 的 map 方法。 map 方法接受类型为 Function 的 lambda它接受一种类型的参数并返回不同类型的对象。
第一次 map 调用:
.map((User user1) -> getPersonFromUser(user))
给出了一个 Lambda,它接受一个将用户转换为人的函数,因此我从“用户的单声道”跳到了“人的单声道”。
我不知道是否有办法直接从 Person 获取 ServerResponse,但是在第二个 map 调用中,您可以编写函数来返回 ServerResponse(在这种情况下,您有一个“Mono of a ServerResponse”并且您是基本完成)或返回另一个中间对象。如果您选择后者,您可能需要额外的映射调用。
注意:如果在你的 Lambda 中,你得到一个 Mono,你会想要使用 flatMap 方法,即如果 getPersonFromUser(user) 返回一个人的 Mono 而不是一个人,那么代替
.map((User user1) -> getPersonFromUser(user))
你会用
.flatMap((User user1) -> getPersonFromUser(user))
您可以查看此 StackOverFlow Question如果你对 map 和平面 map 感兴趣

关于java - Spring-Webflux:在没有 block() 的情况下从 Mono 中提取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63106428/

相关文章:

java - JPackaged JavaFX + Spring boot 不启动

Java:带有额外停止条件的优雅 for 循环

java - 将 JSON 数据转换为关联数组

java - 我想在 lotus Notes 6.5 中使用 java 1.6。有没有办法做到这一点..? –

ruby-on-rails - REST API 版本控制 - 为什么模型没有版本控制

java - 根据自定义条件保护对 Java 方法的访问

java - Spring REST获取多个映射端点的url路径

java - 如何在Spring viewresolver中使用多个地方?

java - Angular 如何知道要调用哪个 Spring Boot REST API?

api - 用于克隆资源的REST API设计