我一直在使用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));
}
}
>
HTTP请求的响应是唯一的。您所能做的就是发送flux
或mono
作为响应主体,并使用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(); 我的问题是:我如何实现