我有一个遗留结构,我需要在Springboot项目中使用百万美元来渲染矩阵(或网格)。
我有几个模型可以用其他信息来表示它。
public class CeldaGrid {
private int valor;
//Removed additional fields
//Constructor
//Getters/Setter
public class MiGrid {
//Represent each column of the matrix
private Collection<CeldaGrid> celdaGridList;
//Constructor
//Getter/Setter
public class ContenedorGrid {
//Represent the matrix
private Collection<MiGrid> gridList = new ArrayList<MiGrid>();
//Constructor
//Getter/Setter
这是我初始化的方式,在这种情况下是3x3矩阵(可能是不同的大小):
Collection<MiGrid> gridList = new ArrayList<MiGrid>();
// Row 1
MiGrid miGrid = new MiGrid();
Collection<CeldaGrid> celdaGridList = new ArrayList<CeldaGrid>();
CeldaGrid celdaGrid = new CeldaGrid();
celdaGrid.setValor(1);
celdaGridList.add(celdaGrid);
celdaGrid = new CeldaGrid();
celdaGrid.setValor(2);
celdaGridList.add(celdaGrid);
celdaGrid = new CeldaGrid();
celdaGrid.setValor(3);
celdaGridList.add(celdaGrid);
miGrid.setCeldaGridList(celdaGridList);
gridList.add(miGrid);
// Row 2
miGrid = new MiGrid();
celdaGridList = new ArrayList<CeldaGrid>();
celdaGrid = new CeldaGrid();
celdaGrid.setValor(4);
celdaGridList.add(celdaGrid);
celdaGrid = new CeldaGrid();
celdaGrid.setValor(5);
celdaGridList.add(celdaGrid);
celdaGrid = new CeldaGrid();
celdaGrid.setValor(6);
celdaGridList.add(celdaGrid);
miGrid.setCeldaGridList(celdaGridList);
gridList.add(miGrid);
ContenedorGrid contenedorGrid = new ContenedorGrid();
contenedorGrid.setGridList(gridList);
model.addAttribute("contenedorgrid", contenedorGrid);
最后是页面:
<form action="#" th:action="@{/}" th:object="${contenedorgrid}" method="post">
<table>
<tbody>
<tr th:each="eachCelda,indexList : *{gridList}">
<td th:each="celda,indexCelda: ${eachCelda.celdaGridList}">
<input type="text" th:id="${celda.valor}"
th:field="*{celdaGridList[__${indexCelda.index}__].valor}"/>
</td>
</tr>
</tbody>
</table>
</form>
这是包含值的列表:
[MiGrid [celdaGridList=[CeldaGrid [valor=1], CeldaGrid [valor=2], CeldaGrid [valor=3]]], MiGrid [celdaGridList=[CeldaGrid [valor=4], CeldaGrid [valor=5], CeldaGrid [valor=6]]]]
这就是错误:
org.springframework.beans.NotReadablePropertyException:无效 bean类的属性'celdaGridList [0]' [org.cabildo.gestatur.model.grid.ContenedorGrid]:Bean属性 'celdaGridList [0]'不可读或具有无效的getter方法: getter的返回类型是否与参数类型匹配 设定器?
代码:
https://www.dropbox.com/sh/ppyf3f0l6p3v2ig/AABjXsS_6Mu2nmKd-XBRTclua?dl=0
更新1:
将代码从Collection更改为List,完全相同的错误。
有什么建议吗?
由于
答案 0 :(得分:1)
您应该将字段 celdaGridList
的类型更改为 MiGrid 类中的List<CeldaGrid>
。
Collection
未排序且没有方法get(int index)
,因此无法获取特定索引的值。但你正试图通过行th:field="*{celdaGridList[__${indexCelda.index}__].valor}
这样做
什么导致例外。
<强>更新强>
我仔细看了一下你的页面。
您已声明一个 ContenedorGrid 类型的对象th:object="${contenedorgrid}"
。然后你在这个对象上使用了一个星号选择器th:field="*{celdaGridList[__${indexCelda.index}__].valor}"
,它等同于th:field="${contenedorgrid.celdaGridList[__${indexCelda.index}__].valor}"
显然是错误的,因为它错过了gridList
。
请使用以下代码更新th:field
中的<input>
属性:
th:field="*{gridList[__${indexList.index}__].celdaGridList[__${indexCelda.index}__].valor}"