当前位置: 首页 > 知识库问答 >
问题:

Spring-WebFlux:从Mono中提取对象,不带块()

萧心远
2023-03-14

我是新的Spring WebFlux。我正在编写一个简单的api,它调用另一个api,并返回响应。我遇到的问题是我的api接受不同于外部api的请求类型。我必须将传入的请求转换为外部api。我使用Mono来接收对我的api的请求,但在没有block()的情况下转换为另一个对象时遇到了麻烦。

输入

@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);
    
       
    
        
    }
 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;
    
    }

有没有一种方法可以把单声道转换成Person对象而不阻塞?

共有1个答案

龙涵蓄
2023-03-14

如果您愿意用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方法接受一个lambda类型函数,该函数接受一种类型的参数并返回一个不同类型的对象。

发出的第一个地图调用:

.map((User user1) -> getPersonFromUser(user))
.map((User user1) -> getPersonFromUser(user))
.flatMap((User user1) -> getPersonFromUser(user))

如果您对map vs flatmap感兴趣,可以查看这个StackOverFlow问题

 类似资料:
  • block()/blockfirst()/blocklast()正在阻塞,线程反应器-http-nio-2不支持这一点 这是正确的方法吗?还有另一种更好的方法来实现这一点?我也在想一些类似的事情:

  • 我正在使用Postman向我的Spring应用程序发送POST请求。请求有一个JSON主体,如下所示: 我有一个方法来处理这些POST请求,我需要能够从请求主体中提取上述JSON数据而不会阻塞。我现在的方法看起来像这样: 然而,这没有任何作用。我尝试使用ServerRequest查看Spring中的答案,并从Spring ServerRequest中获取字符串体,但没有成功。请帮忙。 更新#1 谢

  • getUserDetails方法返回JsonNode类型的Mono。但我真的想退货 但是来自Url的json响应类似于 我尝试了不同的方法,但都不管用。doOnNext(分别为-

  • 好吧,所以我有下面的方法,但我试图摆脱使用。块(),因此尝试实现Mono,但得到错误< code >所需的类型:List 原始代码 我尝试以非阻塞方式重构使用 Mono

  • 我尝试使处理程序和路由器类的Spring引导webflow。模型类是用户类。代码是 下面是webflux项目的处理程序类。在register方法中,我编写了id复制测试代码。但这是完全错误的。 我想提取的用户名或id字符串从Mono的Spring webflow.将需要任何评论。我被这部分卡住了。

  • 我很难理解mono 的用法。请问这个Mono 能给Mono带来什么样的好处? 谢谢。