我一般来说对Spring WebFlux和Reactive编程还是比较陌生的,所以请原谅我的问题是它没有任何意义。
我有一个简单的@PostMapping方法,我试图将Mono中的字段映射到另一个链方法,例如:
@PostMapping
public Mono<Delay> getPlanetNames(@RequestBody Mono<Delay> delayBody) {
return delayBody
.map(p -> new Delay(p.getDelayTime(), getRandomPlanetName()))
.delayElement(Duration.ofMillis(50));
}
public String getRandomPlanetName() {
Random rand = new Random();
List<String> list = Stream.of(
"Mercury",
"Neptune")
.collect(Collectors.toList());
return list.get(rand.nextInt(list.size()));
}
基本上,我要实现的是使用“ getRandomPlanetName()”返回一个新的Planet名称,同时在“ Delay”对象中使用字段设置“ delayElement”。像这样:
@PostMapping
public Mono<Delay> getPlanetNames(@RequestBody Mono<Delay> delayBody) {
return delayBody
.map(p -> new Delay(p.getDelayTime(), getRandomPlanetName()))
.delayElement(Duration.ofMillis(delayBody.getDelayTime));
}
还可以让我只返回一个字符串,它是getPlanetName()的结果,而不是对象的Mono的结果吗?
答案 0 :(得分:0)
基本上,这会查询Mono<Delay>
的延迟时间,并使用此Mono
创建另一个delayElement(delayTime)
。
@PostMapping
public Mono<String> getPlanetNames(@RequestBody Mono<Delay> delayBody) {
return delayBody.flatMap(p -> {
return Mono.just(getRandomPlanetName())
.delayElement(Duration.ofMillis(p.getDelayTime()));
});
}
private String getRandomPlanetName() {
Random rand = new Random();
List<String> list = Arrays.asList("Mercury", "Neptune");
return list.get(rand.nextInt(list.size()));
}
为了使人更易读,我在{}中输入了代码,您也可以这样写:
@PostMapping
public Mono<String> getPlanetNames(@RequestBody Mono<Delay> delayBody) {
return delayBody.flatMap(p -> Mono.just(getRandomPlanetName()).delayElement(Duration.ofMillis(p.getDelayTime())));
}