提问者:小点点

Spring百里香叶中的可编辑表


作为后端程序员,我很少处理网络方面的事情。因此,至少可以说,我对框架的总体理解,尤其是对百里香叶的理解相对简单。但现在我需要创建一个基本的,但希望仍然体面的网站来维护数据库。这是一个非常小的架构,仅由内部用户更新。因此,它不必是面向客户的,也不必是针对所有攻击者的。尽管如此,作为程序员,我希望它不仅仅是垃圾。

我认为最好是一个表示数据库行的html表-DUH。但是我希望整个表是可编辑的,而不是让我编写代码并且用户单击单个行进行编辑。

很久以前,我用JQuery做了类似的事情。我还记得JQuery最适合那些知道自己在做什么的人。所以我试图以较低的复杂性完成这项工作。我想仍然使用百里香叶至少让事情变得有趣一点。

这就是我的知识搁浅的地方。我不知道如何访问数据。

因为对表的大小进行一些限制似乎是个好主意,所以我的SpringMVC控制器返回一个包含检索到的模型对象的Page对象。因此,我的回答是这样的:

无耻地复制例子在表格中展示模型是微不足道的

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

这一切都很棒!但当我试图使表格可编辑时,Thymelaf就不那么适应了。问题是我同意这一点。事实上,现在很难理解为什么它以前奏效了。

<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:模板解析(模板:“类路径资源[templates/listProviders.html]”)期间发生错误,根本原因为org.springframework.beans.NotReadableProperty异常:bean 类 [org.springframework.data.domain.PageImpl] 的属性 'restProvider' 无效: Bean 属性 'restProvider' 不可读或具有无效的 getter 方法: getter 的返回类型是否与 setter 的参数类型匹配?

这一切都很合理。我真正需要做的是将PageImpl.content转换成一个RestProvider对象数组。但是我不知道该怎么做。

到目前为止,我最好的想法是要么完全放弃Pagable,这是我不想做的,要么将对象数组直接放入模型中——从而发送用户数据的2个副本。

第一个想法删除了功能——或者至少让我手工编码。如下所示:使用百里香叶在EL表达式中进行类型转换

第二个实际上只是第一个的变体。我很确定它会奏效。这看起来也是一个彻头彻尾的糟糕想法,而且不能成为该工具的使用方式。

编辑1

根据@Metroids的建议,我更改了字段名称。但现在我明白了

Bean属性'content.content[0]'不可读或具有无效的getter方法

所以我做了看似合乎逻辑的事情,取出了“内容”。这给我留下了:

<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个答案

匿名用户

这里的问题是表达式*{restProvider.enabled}试图解析为providerPage.restProvider.enabled,这当然不是真实的。使用字段表达式时,不能使用由th:eachth:with创建的临时变量。您已经构建了一个完整的表达式,该表达式解析为形式th:object。试试看:

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

这将解析为类似 providerPage.content[0].enabled 的表达式。