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)
10
respostas

Erro na exibição de lista

Prezados,

Ao criar um projeto do zero, sem usar o arquivo disponibilizado para o curso, encontrei um problema na exibição de uma lista no JSP. O nome da classe é Sublotacao; consigo acessar o banco e a lista é corretamente recuperada e repassada para o JSP; contudo, a lista só é corretamente exibida quando o atributo "var" tem nome diferente de "sublotacao", como exibido abaixo:

<c:forEach items="${sublotacaoList}" var="item">
    <tr>    
        <td>${item.descricao} </td>
        <td>${item.caixainstitucional} </td>
    </tr>
</c:forEach>

Seguindo o exemplo do curso e o da documentação do framework, o código ficaria como apresentado abaixo, mas dessa forma, os campos não são exibidos, observando-se apenas que as linhas da tabela correspondem a quantidade de registros:

<c:forEach items="${sublotacaoList}" var="sublotacao">
    <tr>    
        <td>${sublotacao.descricao} </td>
        <td>${sublotacao.caixainstitucional} </td>
    </tr>
</c:forEach>

O que pode estar acontecendo para gerar esse erro?

Obrigada, Cristiane

10 respostas

Oi Cristiane, tudo bem? O que acontece? O campo só fica em branco? Como está o código do seu controller? Não existe ninguém mais incluindo um parâmetro com esse nome (sublotacao) na view? Um abra;co

Tudo bem, Rodrigo! Acontece que os campos são exibidos em branco e a quantidade de linhas criadas na tabela é a mesma de registros que deveriam ser retornados. Por exemplo, são 10 sub-lotações cadastradas no banco e são criadas 10 linhas na tabela, com os campos em branco.

O código do controller segue abaixo:

@Controller
public class SublotacaoController {

    private SublotacaoDAO sublotacaodao;
    private EmpregadoDAO empregadodao;
    private Result result;

    @Inject
    public SublotacaoController(SublotacaoDAO sublotacaodao, EmpregadoDAO empregadodao, Result result) {
        this.sublotacaodao = sublotacaodao;
        this.empregadodao = empregadodao;
        this.result = result;
    }

    @Deprecated
    SublotacaoController() {
        this(null, null, null); // Para uso do CDI!
    }

    @Get("/sublotacao/")
    public List<Sublotacao> listar() {
        return sublotacaodao.listar();
    }

     ...

O código da view é o seguinte:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<html>
<body>

    <div class="container">
        <h3><font color="#265a88">SUB-LOTAÇÕES</font></h3>
          <br>

          <button type="button" class="btn btn-primary">Nova Sub-lotação</button>
          <br><br>
          <div class="table-responsive">
              <table class="table table-hover table-bordered table-condensed">
                 <tr class="info">
                    <th colspan="2" align="center">OPERAÇÕES</td>
                    <th>DESCRIÇÃO</th>
                    <th>CAIXA INSTITUCIONAL</th>
                </tr>
                <c:forEach items="${sublotacaoList}" var="item">
                    <tr>
                        <td align="center"><a href="./alterar/${item.sublotacaoid}" class="btn btn-default"><span class="glyphicon glyphicon-pencil"></span></a></td>
                        <td align="center"><a href="./excluir/${item.sublotacaoid}" class="btn btn-default"><span class="glyphicon glyphicon-remove"></span></a></td>
                        <td>${item.descricao} </td>
                        <td>${item.caixainstitucional} </td>
                    </tr>
                </c:forEach>
              </table>

        </div>
    </div>

</body>
</html>

Obrigada pela atenção, Cristiane

mas com item funciona? Isso é, o problema acontece apenas se o nome da veriável é sublotacao? Ou acontece sempre?

Com item funciona! Essa é a questão! Por quê? Estou com o mesmo problema em outra view e não sei o que estou fazendo errado...

hehe é realmente um mistério! Faz um teste? Coloca no seu JSP a seguinte expression language:

sublotacao: ${sublotacao}

E veja se aparece alguma coisa. Sem alterar nada na lista. Só pra garantir que ninguém mais está usando esse nome de parâmetro

br.embrapa.cnpa.model.Sublotacao@1a6e3cab

Onde é que esse parâmetro está sendo passado, pela caridade?!

a classe Sublotacao está anotada com @Named?

Está!

@Entity
@Named("sublotacao")
@SequenceGenerator(name="SUBLOTACAO_ID", sequenceName="sublotacao_sublotacaoid_seq", allocationSize=1, initialValue=1)
public class Sublotacao { 

    @Id       
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SUBLOTACAO_ID")  
    Long sublotacaoid;
    ...
solução!

O problema é esse! Toda classe anotada com @Named fica disponível na view. Pelo que vi, não faz sentido ter esse @Named ai :) tira que vai funcionar

Exatamente isso! Muitíssimo obrigada!