Webflux Реактивные объекты, не разрешенные до визуализации Thymeleaf View - PullRequest
0 голосов
/ 28 апреля 2020

Когда я пытаюсь отобразить мое представление в 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";
  }

Проект полностью зависит от зависимостей пружинного стартера и не имеет явного класса конфигурации.

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Привет, я также новичок в программировании Spring и Reactive; но я думаю, с этим можно справиться следующим образом.

 @RequestMapping(path = "/")
 @GetMapping
 public Mono<String> home(Model model) {
    return thermostatClient.fetchThermostatState()
      .map(thermostatState -> {
         model.addAttribute("thermostatState", thermostatState);
         return "home";
      });
 }
0 голосов
/ 05 мая 2020

Мне удалось решить эту проблему, удалив из моего списка следующее: xml

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

Это было добавлено без каких-либо жалоб со стороны Spring, но оно почти несовместимо с Webflux. Приложение работает без жалоб, но вы можете сказать, что что-то идет не так, когда в журнале запуска появляется сообщение о том, что оно запускается с Tomcat, а не с Netty. Это признак того, что оно работает как старое приложение MVC, а не как приложение Webflux. Обнаружив это, я смог найти объяснительный ответ на другой вопрос: { ссылка } (разные симптомы, но тот же ответ). Здесь есть немного больше объяснения: { ссылка }

Я смог доказать, что все работает изначально, создав образец приложения с одной зависимостью, который работал так, как я ожидал и увидел в документации. Затем я попытался удалить различные зависимости по одной, пока не обнаружил конфликт.

При устранении неполадок мне препятствовала моя среда IDE, делающая странные вещи, кеширующие зависимости. Обнаружить проблему стало легче, когда я опустился в командную строку и пробовал что-то с mvn clean и mvn spring-boot:run, пока не нашел нарушенную зависимость.

...