Thymeleaf th: предварительная обработка поля не работает с th: each - PullRequest
0 голосов
/ 17 марта 2020

Я хочу отобразить список объектов в таблице вместе с возможностью обновления одного из полей marketallcoation в реальном времени. И я использую тимиан для этой цели. Поэтому мне пришлось использовать th:each в сочетании с емкостью предварительной обработки, доступной в th:field.

В моем классе контроллера я установил атрибут, как показано ниже:

model.addAttribute("marketList",supplyAllocationService.getItems());

И на моей html странице я делаю что-то вроде этого:

<table>
<tr th:each="market,iteration : *{marketList}">
                <td><span th:text="${market.date}" th:field="*{marketList[__${iteration.index}__].date}"> Date </span></td>
                <td><span th:text="${market.country}" th:field="*{marketList[__${iteration.index}__].country}"> Country </span></td>
                <td><span th:text="${market.product}" th:field="*{marketList[__${iteration.index}__].product}"> Product </span></td>
                <td><span th:text="${market.sku != null} ? ${market.sku} : 'None'" th:field="*{marketList[__${iteration.index}__].sku}"> SKU </span></td>
                <td><span th:text="${market.aggregateddemand}" th:field="*{marketList[__${iteration.index}__].aggregateddemand}"> Aggregated Demand </span></td>
                <td><span th:text="${market.aggsupply_12}" th:field="*{marketList[__${iteration.index}__].aggsupply_12}"> 12 weeks aggregated supply </span></td>
                <td><input type="text" th:value="${market.marketallcoation}" th:field="*{marketList[__${iteration.index}__].marketallcoation}"/></td>
                <td><span th:text="${market.unmetdemand}"  th:field="*{marketList[__${iteration.index}__].unmetdemand}"> Unmet demand quantity </span></td>
                <td><span th:text="${market.demandplanner}" th:field="*{marketList[__${iteration.index}__].demandplanner}"> Demand Planner </span></td>
                <td><span th:text="${market.bdmcontact}" th:field="*{marketList[__${iteration.index}__].bdmcontact}"> BDM contact </span></td>
                <td></td>
            </tr>
</table>

Когда я запускаю код, я получаю следующую ошибку:

Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'marketList[0]' available as request attribute
    at org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:153) ~[spring-webmvc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    at org.springframework.web.servlet.support.RequestContext.getBindStatus(RequestContext.java:903) ~[spring-webmvc-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    at org.thymeleaf.spring5.context.webmvc.SpringWebMvcThymeleafRequestContext.getBindStatus(SpringWebMvcThymeleafRequestContext.java:227) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]
    at org.thymeleaf.spring5.util.FieldUtils.getBindStatusFromParsedExpression(FieldUtils.java:306) ~[thymeleaf-spring5-3.0.11.RELEASE.jar:3.0.11.RELEASE]

Согласно документы , th:object не требуется, если используется функция предварительной обработки. Я не использовал его, поэтому я не уверен, что мне здесь не хватает.

1 Ответ

1 голос
/ 17 марта 2020
  1. Если вы используете синтаксис *{...} и / или атрибут th:field, тогда вы должны использовать th:object (они оба зависят от th:object для работы).
  2. Вы не должны использовать th:field для элемента <span/> - это не имеет смысла. (th:field устанавливает атрибуты name, id и value элемента. name и value не влияют на <span /> с.)

Также К сожалению, я не думаю, что вы можете использовать List в качестве объекта формы. Поэтому, чтобы исправить вашу форму, вам нужно сначала создать новый объект с marketList в качестве одного из его свойств, а затем добавить его в модель. Сделайте этот новый объект th:object вашей формы, тогда предварительная обработка должна работать на вас.

<form th:object="${yourNewObject}>
  <table>
    <tr th:each="market, iteration: *{marketList}">
      <td th:text="${market.date}" />
      <td th:text="${market.country}" />
      <td th:text="${market.product}" />
      <td th:text="${market.sku != null} ? ${market.sku} : 'None'" />
      <td th:text="${market.aggregateddemand}" />
      <td th:text="${market.aggsupply_12}" />
      <td><input type="text" th:field="*{marketList[__${iteration.index}__].marketallcoation}"/></td>
      <td th:text="${market.unmetdemand}" />
      <td th:text="${market.demandplanner}" />
      <td th:text="${market.bdmcontact}" />
      <td></td>
    </tr>
  </table>
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...