[RESOLVIDO]Problema ao listar contatos do cliente relação 1:n

14 respostas
C

Bom dia, estou com o seguinte problema:

"could not get a field value by reflection getter"
Consigo listar todos os contatos, mas não consigo listar os contatos por cliente.. acredito que eu não esteja conseguindo passar o cliente.. segue os códigos abaixo, se puderem me ajudar:

@Resource
public class ContatosController
{

	private final Result result;
	private final Validator validator;
	private final ContatoDao daoCont;

	public ContatosController(ClienteDao dao, Result result,
			Validator validator, ContatoDao daoCont)
	{

		this.result = result;
		this.validator = validator;
		this.daoCont = daoCont;
	}

	@Get
	@Path("/contatos/cliente/{cliente.codigo}")
	public List<Contato> lista(Cliente cliente)
	{

		return daoCont.listarPorCliente(cliente);
	}

}
@Component
public class ContatoDao
{

	private final Session session;

	public ContatoDao(Session session)
	{
		this.session = session;
	}

	public Contato carrega(Long codigo)
	{

		return (Contato) this.session.load(Contato.class, codigo);
	}

	public void atualiza(Contato contato)
	{
		Transaction tx = session.beginTransaction();
		this.session.update(contato);
		tx.commit();

	}

	public void remove(Contato contato)
	{

		Transaction tx = session.beginTransaction();
		this.session.delete(contato);
		tx.commit();
	}

	public void salva(Contato contato)
	{

		Transaction tx = session.beginTransaction();
		session.save(contato);
		tx.commit();

	}

	@SuppressWarnings("unchecked")
	public List<Contato> listarPorCliente(Cliente cliente)
	{
		Query query = session
				.createQuery("from Contato WHERE cliente = :codigo_cliente ORDER BY apelido ASC");
		query.setParameter("codigo_cliente", cliente.getCodigo());
		return query.list();
	}

	@SuppressWarnings("unchecked")
	public List<Contato> listar()
	{
		Query query = session.createQuery("from Contato ORDER BY nome ASC");

		return query.list();
	}
}
<%@page contentType="text/html;charset=ISO-8859-1"%>
<%@page pageEncoding="iso-8859-1"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
   <table> 
   
   
  
        <thead> 
             <tr> 
                
                  <th width="410">NOME CONTATO</th> 

                  <th width="80">REMOVER</th> 
                  
             </tr> 
        </thead> 
        
        <tbody> 
        
           <c:forEach    items="${contatoList}"  var="contato"> 
                           
     <tr> 
     
          <td><a  href= "<c:url   value="/contatos/${contato.codigo}"/>">${contato.nome}</a></td> 
        
      

     <td> 
     
    
        <form   action="<c:url     value="/contatos/${contato.codigo}"/>"         method="POST"> 
             <button   class="link"  name= "_method"  value= "DELETE">Remover</button> 
        </form> 
        
       
        
        
    </td> 
  
</c:forEach> 

             
               
        </tbody> 
  
   </table>
@Entity
public class Contato
{
	@Id
	@GeneratedValue
	@NotNull
	private long codigo;

	@ManyToOne
	@JoinColumn(name = "cliente")
	private Cliente cliente;

	private String nome;

	public long getCodigo()
	{
		return codigo;
	}

	public void setCodigo(long codigo)
	{
		this.codigo = codigo;
	}

	public Cliente getCliente()
	{
		return cliente;
	}

	public void setCliente(Cliente cliente)
	{
		this.cliente = cliente;
	}

	public String getNome()
	{
		return nome;
	}

	public void setNome(String nome)
	{
		this.nome = nome;
	}

}

14 Respostas

Lucas_Cavalcanti

em qual momento acontece esse erro?

C

Quando tentava exibir os contatos por cliente, mas agora consegui fazendo isto

@SuppressWarnings("unchecked") public List<Contato> listarPorCliente(Long codigo) { Query query = session .createQuery("from Contato WHERE cliente.codigo = :codigo_cliente ORDER BY nome ASC"); query.setParameter("codigo_cliente", codigo); return query.list(); }

O problema agora é outro, não consigo passar o cliente pela jsp… para quando adicionar um contato… já saber que este contato pertence ao respectivo cliente…

Lucas_Cavalcanti

para fazer isso, crie um input com o nome contato.cliente.id (se esse for o caminho pelos getters/setters) e o valor com o id do cliente

C

Pelo que entendi, criar um input na pagina formulario de adição do contato, vou tentar… qualquer coisa posto aqui!

Obrigado pela atenção!

C

result.include(“cliente”, cliente);

Usando isto no controller do formulario do contato, consegui pegar o valor e salvar no banco com o contato do cliente… tudo certo…
Mas a página com a informação do cliente estava separada da lista de contato… então usei um include conforme segue abaixo, na página com os dados/ edita do cliente

<jsp:include page="…/contatos/lista.jsp" />

mas a lista não carrega…
Mas se eu entrar no url da lista, passando o codigo do cliente via url… ai mostra a lista certinho…

Alguma ideia?

Lucas_Cavalcanti

use o <c:import ao invés do <jsp:include, e aponte pra url do controller

C

Tentei varias vezes, segue o erro que mostra no navegador e no console: Unterminated <c:import tag

R

Clarel,

Você não deve estar fechando a tag corretamente.

C

<c:import url="/contatos/lista/${cliente.codigo}"></c:import>

ai está o import… quando eu abro a página que está o import… na verdade não abre, fica tudo em branco no navegador… e nao mostra erro nenhum no console…

pode ter algo a ver com o sitemesh?

Lucas_Cavalcanti

o html da página foi incluído?

o problema é que fazer o import de toda a página vai incluir o header e o footer que vc configurou no sitemesh…
daí vai parecer que é uma página dentro da outra.

porque você quer fazer isso mesmo?

C

É a página que mostra os contatos do cliente selecionado… se eu copiar o html da lista e colocar no html dos clientes… ai funciona… mas não me parece muito bom trabalhar assim… acho que ficaria melhor ter a pagina separada para quando precisar mudar o conteudo, e ter ela dentro da pagina do cliente automaticamente…
não tenho outra ideia de como fazer…

C

aceito sugestões!

Lucas_Cavalcanti

se o html for igual mesmo, vc pode fazer dois métodos do controller irem pra mesma jsp:

public void lista() {
  //...
}

public void mostra(Cliente cliente) {
   //...
   result.of(this).lista(); // se não quiser executar o método lista ou
   result.forwardTo(this).lista(); //se quiser executar.
}
C

Resolvi da seguinte maneira..

na página que exibia os dados do cliente que eu selecionei da lista, coloquei o

<jsp:include page="/WEB-INF/jsp/contatos/lista.jsp"/>

que seria a lista de contatos por cliente..

e no controller desta página de cliente, adicionei
[quote]

@Get
@Path("/clientes/{codigo}")
public Cliente edita(Long codigo)
{
ContatoDao daoCont = new ContatoDao(session);

result.include("contatoList", daoCont.listarPorCliente(codigo));
return dao.carrega(codigo);

}
[code]

Obrigado pela Atenção!

Criado 4 de abril de 2012
Ultima resposta 2 de mai. de 2012
Respostas 14
Participantes 3