在渲染百里叶视图之前未解析Webflow反应对象

2022-04-06 00:00:00 java spring-webflux thymeleaf

当我尝试在百里叶中呈现我的视图时,遇到错误Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'currentTemperature' cannot be found on object of type 'reactor.core.publisher.MonoMapFuseable' - maybe not public or not valid?

Spring WebFlux文档声明"具有反应类型包装器的模型属性被解析为它们的实际值",但是将Mono<;>作为模型传递给视图会给出上面的错误。

  @RequestMapping(path = "/")
  @GetMapping
  public String home(Model model) {
    Mono<ThermostatState> thermostatState = thermostatClient.fetchThermostatState();
    model.addAttribute("thermostatState", thermostatState);
    return "home";
  }

阻止Mono<;>并展开内部值会使模板呈现不变,但在某种程度上消除了使用反应库的意义。

  @RequestMapping(path = "/")
  @GetMapping
  public String home(Model model) {
    Mono<ThermostatState> thermostatState = thermostatClient.fetchThermostatState();
    ThermostatState unwrappedState = thermostatState.block();
    model.addAttribute("thermostatState", unwrappedState);
    return "home";
  }

该项目完全依赖于Spring启动器依赖项,并且没有显式配置类。


解决方案

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

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

这是由Spring starter毫无怨言地添加的,但它与Webflow准不兼容。这个应用程序运行时没有任何问题,但当它在启动日志中报告它是从Tomcat启动的,而不是Netty时,你可以感觉到出了问题。这表明它是作为老式的MVC应用程序运行的,而不是Webflow应用程序。发现这一点后,我能够找到另一个问题的解释性答案:https://stackoverflow.com/a/48418409/23276(症状不同,但答案相同)。这里还有更多的解释:https://stackoverflow.com/a/51378560/23276

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

在对此进行故障排除时,我的IDE做了一些奇怪的事情来缓存依赖项,这阻碍了我的工作。当我拖到命令行并尝试使用mvn cleanmvn spring-boot:run直到找到损坏的依赖项时,发现问题变得更容易了。

相关文章