th: каждая ошибка индексации - PullRequest
0 голосов
/ 08 января 2020

У меня проблемы с индексацией для каждого объекта. У меня есть список, который я извлекаю из хранилища, который называется MonthlyAcct. Я хочу перебрать список в файле thymeleaf html и показать каждое свойство объекта MonthlyAcct, отображаемое в виде редактируемого поля ввода внутри таблицы. Я продолжаю получать сообщения о том, что индексирование в тип 'monthAcct' не поддерживается, или в настоящее время возникает ошибка: "Ни BindingResult, ни простой целевой объект для имени компонента" monthAcct [0] "не доступны в качестве атрибута запроса". Это определенно проблема с тем, как я настроил th: field, как будто я переключаю его на th: name, он появляется и не выдает ошибок. Должен ли я сделать это в форме, чтобы заставить th: field работать? Я использовал этот же стиль / tacti c в других областях моего проекта, и он работает, поэтому я не уверен, почему на этот раз этот тип настройки не работает. Любые идеи? У меня также есть другая форма на этой странице, которая обновляет детали для класса клиента, может ли это вызывать какие-либо проблемы?

Просто для справки я пробовал * и $ с оператором th: each, а также пробовал оба символа с полем th :. Оба выдают вышеупомянутую ошибку.

<table class="table table-striped" data-toggle="table" data-show-toggle="true" data-classes="table-no-bordered" data-striped="true" data-search="true"  data-show-columns="true" >
    <thead>
        <th>year</th>
        <th>January</th>
    </thead>
    <tbody>
        <tr th:each="acct, stat : ${monthAcct}">
            <td th:text="${acct.year}"></td>
            <td>
            <input type="number" class="text-left form-control"  th:field="${monthAcct[__${stat.index}__].janAmt}"/>
            </td>
        </tr>
    </tbody>
</table>

В контроллере:

@RequestMapping(value="/accounting/client/{id}")
public String accountingDetails(@PathVariable("id")Client client, MonthlyAccountingTracker monthlyAccountingTracker, Model model) {
    List<MonthlyAccountingTracker>  monthAcct = monthlyAccountingTrackerRepository.findByClient(client);
    model.addAttribute("client",clientRepository.findById(client.getId()));
    model.addAttribute("monthAcct",monthAcct);
    return "accounting";
}

@DynamicUpdate
@Entity
@Table(name="MonthlyMinAcctTracker")
@EntityListeners(AuditingEntityListener.class)
public class MonthlyAccountingTracker {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @ManyToOne
    @JoinColumn(name="client")
    private Client client;
    private BigDecimal year;
    private BigDecimal janAmt;
    
     public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Client getClient() {
        return client;
    }

    public void setClient(Client client) {
        this.client = client;
    }

    public BigDecimal getJanAmt() {
        return janAmt;
    }

    public void setJanAmt(BigDecimal janAmt) {
        this.janAmt = janAmt;
    }
}

Я получаю свой список месячных действий из хранилища:

public interface MonthlyAccountingTrackerRepository extends CrudRepository<MonthlyAccountingTracker,Long>, JpaSpecificationExecutor {

    MonthlyAccountingTracker save(MonthlyAccountingTracker entity);

    MonthlyAccountingTracker findById(Long id);

    List<MonthlyAccountingTracker> findByClient(Client client);

    void delete(MonthlyAccountingTracker entity);

    List<MonthlyAccountingTracker> findAll();
}

Ответы [ 3 ]

1 голос
/ 08 января 2020

Вы не можете использовать список в качестве объекта поддержки формы. Вам нужен другой объект, который оборачивает ваш массив (и использовать этот объект в качестве вашего вспомогательного объекта). Например:

Java:

// Backing object
class BackingObject {
  List<MonthlyAccountingTracker> accounts;

  public BackingObject(List<MonthlyAccountingTracker> accounts) {
    this.accounts = accounts;
  }

  // Put in getters/setters...
}

// Controller
@RequestMapping(value="/accounting/client/{id}")
public String accountingDetails(@PathVariable("id")Client client, MonthlyAccountingTracker monthlyAccountingTracker, Model model) {
  model.addAttribute("client",clientRepository.findById(client.getId()));
  model.addAttribute("form", new BackingObject(monthlyAccountingTrackerRepository.findByClient(client)));
  return "accounting";
}

Форма:

<form th:object="${form}">
  .
  .
  .

  <tr th:each="acct, stat : *{accounts}">
      <td th:text="${acct.year}"></td>
      <td>
        <input type="number" class="text-left form-control"  th:field="*{accounts[__${stat.index}__].janAmt}"/>
      </td>
  </tr>

  .
  .
  .
</form>
1 голос
/ 08 января 2020

* {monthAcct} должно быть $ {monthAcct}, так как вы устанавливаете значение в modelAndView или в вашей модели случая. MonthAcct не является полем th: object.

0 голосов
/ 09 января 2020

Вы должны использовать знак * вместо $ для поля monthAcct:

<input type="number" class="text-left form-control"  th:field="*{monthAcct[__${stat.index}__].janAmt}"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...