Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
2
respostas

Erro ao passar lista para foreach dentro de tag

Boa tarde,

Estou tendo um problema com uma tag e o foreach. Criei está tag por possuir um conteudo que se repetia no meu codigo, o que estava dificultando a manutenção.

a tag é a seguinte:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>

<%@ attribute name="contas" required="true"%>
<%@ attribute name="metodoUrl" required="true"%>
<!-- CC#conta -->


<c:forEach items="${contas }" var="conta" varStatus="loop">

        <c:if test="${loop.index % 2 == 0 }">

            <div class="row">
        </c:if>
        <div class="col-12 col-sm-6 mb-3 ">
            <a class="w-100 h-100 "
                href="${s:mvcUrl('CC#conta').arg(0, conta.id).build() }">
                <div class="w-100 mr-0 card  border-primary  h-100">
                    <div class="card-header">
                        <h5>${conta.cliente.nome}</h5>
                    </div>
                    <div class="card-body">

                        <p class="card-text">Data de inicio: ${conta.dataInicio }</p>
                        <p class="card-text">Data de fim: ${conta.dataFim }</p>
                    </div>
                </div>
            </a>
        </div>
        <c:if test="${loop.index % 2 == 1 || loop.last }">

            </div>

        </c:if>


    </c:forEach>

Mas ao rodar o codigo recebo o seguinte erro:

org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: javax.servlet.jsp.JspException: javax.el.PropertyNotFoundException: Property [id] not found on type [java.lang.String]

quando executo o mesmo codigo na pagina original, tudo funciona.

Segue a chamada da tag:

<tags:cardContaTemplate contas="${contas }" metodoUrl="CC#conta"></tags:cardContaTemplate>

O que pode estar acontecendo?

2 respostas

Isso significa que a classe String não tem um método getter público (não estático!) para a propriedade mencionada id.

Provavelmente o problema é em conta.id (dentro do s:mvcUrl). Seu objeto conta é uma String, mas deveria ser o objeto.

Caso tenha problemas, posta o código do seu controller

solução!

Eu já tinha até me esquecido deste tópico hahaha. A forma mais facil que eu achei para corrigir este erro, é definindo o type do atributo na tag. Neste caso, como é uma lista de contas, eu so prciso definir a tag da seguinte maneira <%@ attribute name="contas" required="true" type="java.util.List"%> . Na tag não é necessário utilizar generics (e até onde eu sei, nem é possivel)