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

Spring网络通量和反应器中的Map与FlatMap

淳于功
2023-03-14

我一直在使用Spring Boot 2.0.1及其Webflux库开发一个示例reactive web api。我一直在看网上的例子,试图建立它,但我被两件事难倒了。下面是我的两个问题。

1)如何返回响应实体流,当我尝试时,我得到一个错误,说只能返回单个响应实体。下面是我当前的代码。

@Service
public class MovieServiceImpl implements MovieService {

    @Autowired
    private MovieRepository movieRepository;

    @Override
    public Flux<Movie> list(){
        return movieRepository.findAll();
    }
}

@RestController
public class MovieRestController {

    @Autowired
    private MovieService movieService;

    @GetMapping(value = "/movies")
    public Flux<Movie> list() {

        return movieService.list();
    }
}

2)当我更新一个对象时,我使用一个flatMap来更新保存在Mongo中的对象,然后使用一个Map来将其转换为响应实体。我的问题是为什么我在这里使用flatMap而不是Map?我从在线示例中导出了这段代码,但没有示例解释flatMap的用法。我想理解为什么在这里使用它。下面是代码。

@Service
public class MovieServiceImpl implements MovieService {

    @Autowired
    private MovieRepository movieRepository;

    @Override
    public Mono<Movie> update(String id, MovieRequest movieRequest) {

       return movieRepository.findById(id).flatMap(existingMovie -> {

           if(movieRequest.getDescription() != null){
               existingMovie.setDescription(movieRequest.getDescription());
           }
           if(movieRequest.getRating() != null){
               existingMovie.setRating(movieRequest.getRating());
           }
           if(movieRequest.getTitle() != null) {
               existingMovie.setTitle(movieRequest.getTitle());
           }

           return movieRepository.save(existingMovie);

       });
    }
}

@RestController
public class MovieRestController {

    @Autowired
    private MovieService movieService;

    @PutMapping("/movies/{movieId}")
    public Mono<ResponseEntity<Movie>> update(
            @PathVariable("movieId") final String movieId,
            @RequestBody final MovieRequest movieRequest) {

        return movieService.update(movieId, movieRequest)
                .map(m -> new ResponseEntity<>(m, HttpStatus.OK))
                .defaultIfEmpty(new ResponseEntity<>(HttpStatus.NOT_FOUND));

    }
}

共有1个答案

龙亮
2023-03-14

>

  • HTTP请求的响应是唯一的。您所能做的就是发送fluxmono作为响应主体,并使用content-type标头让客户机知道它可以作为流application/stream+json或通常的application/json使用。

    findbyid(id)movierepository.save(existingMovie)都返回mono 。如果映射它,传递给映射的每个事件movie都将返回一个mono ,因此findbyid().map(Movierepository.save())的连接最终会得到一个mono > 。当您进行flatmap时,基本上是将地图中的所有发布者“合并”到一个单点中。

  •  类似资料:
    • 因此,我从文档中了解到,并行通量本质上是将通量元素划分为单独的轨道。(本质上类似于分组)。就线程而言,这将是调度程序的工作。让我们考虑一下这样的情况。所有这些都将在通过runOn()方法提供的同一个调度程序实例上运行。让我们考虑如下情况: 现在让我们打大约100个电话 如果我们使用parailFlux: 因此,如果我的理解是正确的,那么它似乎非常相似。那么,平行磁通相对于磁通的优势是什么?什么时候

    • 如何将Mono/Flux的所有结果相加 我有一些反应代码,我返回一个Flux并链接一些其他函数,我会用一些代码来解释它。 所以我返回一个流量,这是一个流量的评论。我想将此查询的所有注释映射到一个函数,在该函数中,我扫描每个注释的内容以查找标记,这是由标记服务(taggingservice)实现的。标记,该函数返回一个单声道 我想做的是统计问题每条评论的所有标签,并将其返回到StatsModel中,

    • 我用的是Spring助焊剂。我需要从不同的来源组装一个物体。如何确保两个流都返回了所需的数据? 比如:

    • 当客户端发出请求时,“MonoJust”会打印在第4行,但“test”会在Http响应正文中返回。我知道发布者在订阅之前不会生成数据,那么为什么Http响应包含“test”而不是“MonoJust”?

    • 在reactor Netty之前,我将创建Netty Tcp服务器的方式是创建服务器引导并添加我的自定义管道类。Reactor-Netty有tcpServer.create(),但似乎我必须创建一个新的函数接口,它接受NettyInbound和NettyOutbound并返回一个Mono。但是,如果我想添加一个构建管道的ChannelInitializer,我必须阻塞以获得NettyContext

    • 我目前正在使用自定义JWT身份验证进行SpringCloudGateway。身份验证后,我希望使用GlobalFilter将标头中的JWT令牌字符串传递到下游服务: JWT令牌字符串可以通过调用主体来获得。getName(); 我的问题是:我如何实现