使用百日咳

时间:2017-08-08 12:46:57

标签: java spring matrix thymeleaf

我有一个遗留结构,我需要在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,完全相同的错误。

有什么建议吗?

由于

1 个答案:

答案 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}"