Редактируемый Стол в Весеннем Тимелиф - PullRequest
0 голосов
/ 08 апреля 2019

Как бэкэнд-программист, я редко сталкиваюсь с веб-аспектами.По меньшей мере, мое понимание фреймворков в целом и Thymeleaf в частности является относительно упрощенным.Но теперь мне нужно создать несколько базовый, но, надеюсь, все еще приличный веб-сайт для ведения базы данных.Это очень маленькая схема, которая будет обновляться только внутренними пользователями.Таким образом, он не должен быть обращен к клиенту отполирован или защищен от всех злоумышленников.Тем не менее программист во мне хочет, чтобы это было больше, чем просто мусор.

Я думаю, что было бы неплохо, это HTML-таблица, представляющая строки базы данных - DUH.Но я бы хотел, чтобы вся таблица была редактируемой, а не заставляла меня писать код, и пользователь нажимал на отдельные строки для редактирования.

Много лет назад я делал нечто подобное с JQuery.Я также помню, что JQuery лучше всего используется людьми, которые знают, что они делают.Поэтому я пытаюсь достичь этого с меньшей сложностью.Я хотел бы по-прежнему использовать Thymeleaf, чтобы хотя бы сделать вещи немного интереснее.

И именно здесь мои знания сели на мель.Я не могу понять, как получить доступ к данным.

Поскольку установление некоторого ограничения на размер таблицы кажется хорошей идеей, мой контроллер SpringMVC возвращает объект Page, содержащий извлеченные объекты модели.Таким образом, мой ответ выглядит так:

enter image description here

Бесстыдно копируя примеры, было тривиально отображать модели в таблице, например:

  <tr th:each="restProvider : ${providerPage.content}">
  <td th:text="${restProvider.enabled}" />

Это все было здорово!Но когда я попытался сделать таблицу редактируемой, тимелиф оказался не таким уж приличным.Проблема в том, что я согласен с этим.На самом деле, сейчас трудно понять, почему это работало раньше.

<form action="#" th:action="@{/saveProvider}" 
    th:object="${providerPage.content}" method="post">

<table border="1">
    <tbody>
    <tr th:each="restProvider, i : ${providerPage.content}" >
    <td th:style="'text-align: center;'" /> <input type="text" th:field="*{content[__${i.index}__].enabled}"  />

    <td th:text="${restProvider.serviceName}" />

org.thymeleaf.exceptions.TemplateInputException: произошла ошибка при разборе шаблона (template: "ресурс пути к классу [templates / listProviders.html] ")] с первопричиной org.springframework.beans.NotReadablePropertyException: недопустимое свойство restProvider класса бина [org.springframework.data.domain.PageImpl]: свойство бина restProvider недоступно для чтения или имеет недопустимый получательМетод: Тип возвращаемого значения получателя соответствует типу параметра установщика?

Все это имеет смысл.Что мне действительно нужно сделать, это привести PageImpl.content в массив объектов RestProvider.Но я понятия не имею, как это сделать.

Моя лучшая идея на данный момент - либо полностью отказаться от Pagable, чего я не хочу делать, либо поместить массив объектов непосредственно вМодель - таким образом отправка 2 копий пользовательских данных.

Первая идея удаляет функциональность - или, по крайней мере, заставляет меня кодировать ее вручную.Как было предложено здесь: приведение типа в выражениях EL с использованием Thymeleaf

Второе действительно просто вариант первого.Я уверен, что это сработает.Это также кажется совершенно ужасной идеей и не может быть способом, которым инструмент должен использоваться.

РЕДАКТИРОВАТЬ 1

Используя советы @Metroids Iизменил обозначение поля.Но теперь я получаю

Свойство bean-компонента 'content.content [0]' не читается или имеет недопустимый метод получения

Итак, я сделал, казалось бы, логичную вещь и взялиз "контента".Это оставило меня с:

<td th:style="'text-align: center;'" /> <input type="text" th:field="*{[__${i.index}__].enabled}"  />

Но это дало мне только то, что:

Bean property 'content.[0]' is not readable or has an invalid getter method

Я пробовал несколько других вещей.В том числе возиться с тем, как указан итератор.Но ни один из них не может избавиться от лишних ".".

РЕДАКТИРОВАТЬ 2

Добавлена ​​информация формы

1 Ответ

0 голосов
/ 08 апреля 2019

Проблема здесь в том, что выражение *{restProvider.enabled} пытается разрешить до providerPage.restProvider.enabled, что, конечно, не реально.Когда вы используете выражения поля, вы не можете использовать временные переменные, созданные th:each или th:with.Вы создали полное выражение, которое разрешается до форм th:object.Попробуйте это:

<tr th:each="restProvider, i : ${providerPage.content}">
    <td>
        <input type="text" th:field="*{content[__${i.index}__].enabled}"  />

Это будет преобразовано в выражение типа providerPage.content[0].enabled.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...