Java Webflux反应对象在渲染视图之前未解析

Java Webflux反应对象在渲染视图之前未解析,java,thymeleaf,spring-webflux,Java,Thymeleaf,Spring Webflux,当我尝试在Thymeleaf中呈现我的视图时,我得到一个错误,原因是:org.springframework.expression.spel.SpelEvaluationException:EL1008E:在“reactor.core.publisher.monomapfusable”类型的对象上找不到属性或字段“currentTemperature”—可能不是公共的或无效的? SpringWebFlux文档声明“具有反应式类型包装的模型属性将解析为其实际值”,但将Mono作为模型传递给视图会产

当我尝试在Thymeleaf中呈现我的视图时,我得到一个错误
,原因是:org.springframework.expression.spel.SpelEvaluationException:EL1008E:在“reactor.core.publisher.monomapfusable”类型的对象上找不到属性或字段“currentTemperature”—可能不是公共的或无效的?

SpringWebFlux文档声明“具有反应式类型包装的模型属性将解析为其实际值”,但将Mono作为模型传递给视图会产生上述错误

  @RequestMapping(path = "/")
  @GetMapping
  public String home(Model model) {
    Mono<ThermostatState> thermostatState = thermostatClient.fetchThermostatState();
    model.addAttribute("thermostatState", thermostatState);
    return "home";
  }
@RequestMapping(path=“/”)
@GetMapping
公共字符串主页(模型){
Mono thermostatState=thermostatClient.fetchThermostatState();
addAttribute(“恒温器状态”,恒温器状态);
返回“家”;
}
阻塞Mono并展开内部值会使模板渲染保持不变,但有点消除了使用反应库的必要性

  @RequestMapping(path = "/")
  @GetMapping
  public String home(Model model) {
    Mono<ThermostatState> thermostatState = thermostatClient.fetchThermostatState();
    ThermostatState unwrappedState = thermostatState.block();
    model.addAttribute("thermostatState", unwrappedState);
    return "home";
  }
@RequestMapping(path=“/”)
@GetMapping
公共字符串主页(模型){
Mono thermostatState=thermostatClient.fetchThermostatState();
恒温器状态展开状态=恒温器状态.block();
addAttribute(“恒温器状态”,展开状态);
返回“家”;
}

该项目完全依赖于spring starter依赖项,没有显式的配置类。

嗨,我对spring和反应式编程也不熟悉;但我认为,这可以通过这种方式处理

 @RequestMapping(path = "/")
 @GetMapping
 public Mono<String> home(Model model) {
    return thermostatClient.fetchThermostatState()
      .map(thermostatState -> {
         model.addAttribute("thermostatState", thermostatState);
         return "home";
      });
 }
@RequestMapping(path=“/”)
@GetMapping
公共单色住宅(模型){
返回thermostatClient.fetchThermostatState()
.map(恒温器状态->{
addAttribute(“恒温器状态”,恒温器状态);
返回“家”;
});
}

我可以通过从pom.xml中删除以下内容来解决此问题

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>

org.springframework.boot
(不同的症状,但答案相同)。这里有更多的解释:

我能够通过创建一个依赖关系示例应用程序来证明事情最初是可行的,该应用程序按照我在文档中预期和看到的方式工作。然后我尝试一个接一个地删除不同的依赖项,直到发现冲突


在解决这个问题时,IDE在缓存依赖项时做了一些奇怪的事情,这阻碍了我的工作。当我转到命令行并尝试使用
mvn clean
mvn spring boot:run
直到我发现断开的依赖关系时,发现问题变得更容易了。

您的代码工作正常,我认为这是一个比使用
block()
更好的解决方案。我想你的方式不会像我的方式那样占据一条线索(不确定这是不是真的,但它是有意义的)。但是我觉得把控制器的返回推迟到将来解决是没有必要的。Thymeleaf Webflux示例不这样做,但由于某些原因,它对我不起作用。顺便说一句,该方法的返回值需要从
String
更改为
Mono
,才能使上述代码起作用。是的,我没有更改返回类型,因此我更正了它。很高兴看到我的回答对你有帮助。请将其标记为答案,如果它是适合您的解决方案,如果它对您有效,那么您应该接受此答案@JoshRivers@Shoshi请注意,代码“有效”(就像我的示例中使用
block()的代码一样)
,但我的问题没有得到解决,因为框架仍然没有按照文档记录或预期的方式工作。Krishna的回答是一个优雅的解决方法,但可能会对性能产生副作用(不清楚是否是这种情况)而且它仍然不能使模板/模型解析器在本地与反应对象一起工作。如果在呈现模板之前需要收集和解析多个未来,这也会非常尴尬。