1
resposta

Thymleaf: bind de lista como modelAttribute

Olá. No meu sistema eu tenho uma tabela onde uma lista de objetos são exibidos. E para cada linha da tabela eu crio um select com um lista de opções.

Imagem de exemplo da tela: https://wetransfer.com/downloads/544542e56d3a0b7925ece3a2c5afb67220191016125456/b812de/preview/9bd0c780fe120a75984f0b643ce6c6f020191016125456

Controller:

        @RequestMapping(value = "/salvacadastrocombinacao", method = RequestMethod.POST)
    public String salvaCadastroCombinacao(Model model, CombinacaoTO novaCombinacao){
        model.addAttribute("novaCombinacao", novaCombinacao);


        List<AtributoTO> atributosMarketplace = marketplaceService.buscaAtributosPorCategoria(Integer.parseInt(novaCombinacao.getIdGrupoMarketplace()), Integer.parseInt(novaCombinacao.getIdMarketplace()));

        model.addAttribute("atributosMarketplace", atributosMarketplace);

        List<AtributoTO> atributosVendedor = vendedorService.buscaAtributosPorCategoria(Integer.parseInt(novaCombinacao.getIdGrupoVendedor()), Integer.parseInt(novaCombinacao.getIdVendedor()));

        model.addAttribute("atributosVendedor", atributosVendedor);


        List<CombinacaoAtributoTO> combinacaoAtributos = new ArrayList<CombinacaoAtributoTO>();
        model.addAttribute("combinacaoAtributos", combinacaoAtributos);

        return "cadastroCombinacaoAtributos";
    }
    }

Classes:

public class CombinacaoAtributoTO {
    private String idMarketplace;
    private String idVendedor;
    private String idAtributoMarketplace;
    private String idAtributoVendedor;

getters e setter...
}

Minha view:

                   <tbody>
                        <th:block th:each="atributoMartketplace,stat : ${atributosMarketplace}">
                        <tr>
                          <th scope="row" th:text="${atributoMartketplace.nome}">
                              <input th:value="${atributoMartketplace.id}" th:field="*{combinacaoAtributos[__${stat.index}__].idAtributoMarketplace}" hidden/>
                          </th>
                          <td>
                              <select class="selectpicker" data-live-search="true" th:field="*{combinacaoAtributos[__${stat.index}__].idAtributoVendedor}"> 
                                  <option th:value="0">Selecione uma opção</option>
                                  <option th:each="atributoVendedor : ${atributosVendedor}" th:value="${atributoVendedor.id}" th:text="${atributoVendedor.nome}"></option>
                              </select>
                          </td>                             
                        </tr>                
                      </th:block>

Ele não consegue fazer o bind disso:

List combinacaoAtributos = new ArrayList();

com isso:

th:field="*combinacaoAtributos[${stat.index}].idAtributoMarketplace}"

O seguinte erro é retornado:

Caused by: org.springframework.beans.NotReadablePropertyException: Invalid property 'combinacaoAtributoWrapper' of bean class [br.com.combinacaotaxonomias.model.CombinacaoAtributoWrapper]: Bean property 'combinacaoAtributoWrapper' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

Já tentei diversas abordagens...

1 resposta

Gustavo, tudo bem?

Cara você não fez o getter e setter para propriedade combinacaoAtributoWrapper na sua classe CombinacaoAtributoWrapper

Cria e fala para gente se deu certo.