[Resolvido] NumberFormatException ao testar um atributo

27 respostas
Guevara

Boa tarde pessoal!
O teste do avatar na JSP estava funcionando corretamente, agora não sei pq estou recebendo esta exception:

root cause

java.lang.NumberFormatException: For input string: "avatar"
	java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
	java.lang.Integer.parseInt(Integer.java:449)
	java.lang.Integer.parseInt(Integer.java:499)
	javax.el.ListELResolver.coerce(ListELResolver.java:167)
	javax.el.ListELResolver.getValue(ListELResolver.java:51)
	javax.el.CompositeELResolver.getValue(CompositeELResolver.java:54)
	org.apache.el.parser.AstValue.getValue(AstValue.java:123)
	org.apache.el.parser.AstEqual.getValue(AstEqual.java:37)
	org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)

Só que avatar não é String, é atributo do tipo Foto na classe Imovel:

public class Imovel {
@OneToOne(targetEntity=Foto.class)
	private Foto avatar;
}

Estou testando assim:

<c:when test="${imovel.avatar.idFoto eq null}">

Fiz tb:

<c:when test="${imovel.avatar.idFoto == null}">

E também (apelei):

<c:when test="${empty imovel.avatar.idFoto}">

Como é atributo, pensei em remover imovel deixando apenas avatar.idFoto:

<c:when test="${avatar.idFoto eq null}">

Não tomo exception, mas tb não mostra nada do imóvel. O.o
A coluna do avatar na tabela imovel ficou assim:

Alguém sabe onde está o problema?
Abraço! o/

27 Respostas

Lucas_Cavalcanti

vc não deve comparar com null no jsp… o jeito certo eh o empty mesmo…

o erro tá dando por causa de um input que vc tem na sua tela, e tá passando a string “avatar” num lugar que tem que ser um número…

tenta ver aí, qqer coisa posta aqui um parte do seu formulario

Guevara

Oi Lucas! o/
Tá dando erro nesta lista de imóveis, onde a primeira linha é pra testar o avatar:

<display:table name="${imoveis}" pagesize="5" id="imovel" requestURI="/imobiliaria/imovel/listaVenda">  
<c:choose>
<c:when test="${empty imovel.avatar.idFoto}"> 
<display:column><a href="/imobiliaria/index/visualizar?codImovel=${imovel.codImovel}"><img src="${pageContext.request.contextPath}/imagens/aplication/avatar.jpg" width="65" height="55"></a></display:column>
</c:when>	
<c:otherwise>	
<display:column><a href="/imobiliaria/index/visualizar?codImovel=${imovel.codImovel}"><img src="<c:url value="/avatar/${imovel.codImovel}"/>" width="65" height="55"/></a></display:column>
</c:otherwise>
</c:choose>
<display:column property="codImovel" title="Código" />
<display:column property="titulo" title="Titulo" maxLength="30" />
<display:column property="endereco.bairro" title="Bairro" maxLength="25" />
<display:column property="endereco.cidade" title="Cidade" maxLength="25" />
<display:column property="endereco.estado" title="Estado" maxLength="25" />
<display:column property="valor" format="{0,number,0,000.00}" sortable="true" title="Valor(R$)" maxLength="10" />
<display:column property="area" title="Área" maxLength="10" />   
<display:column title="Imagens"><a href="/imobiliaria/foto/galeria?codImovel=${imovel.codImovel}"><img src="${pageContext.request.contextPath}/imagens/aplication/Picture_16x16.png"></a></display:column>   
<display:column title="Mapa"><a href="index/maps?codImovel=${imovel.codImovel}"><img src="${pageContext.request.contextPath}/imagens/aplication/Map_16x16.png"></img></a></display:column>
</display:table>

O teste é, se avatar for null vai aparecer uma imagem para informar que não possui avatar, se tiver vai aparecer a foto q é avatar.
O estranho é que isso estava funcionando normalmente. O.o
Abraço!

cinei

E se você tentar assim, faz alguma diferença?

<c:if test="${imovel.avatar.idFoto == null}">
      <display:column><a href="/imobiliaria/index/visualizar?codImovel=${imovel.codImovel}"><img src="${pageContext.request.contextPath}/imagens/aplication/avatar.jpg" width="65"      height="55"></a></display:column>
</c:if>

<c:if test="${imovel.avatar.idFoto !== null}">
      <display:column><a href="/imobiliaria/index/visualizar?codImovel=${imovel.codImovel}"><img src="<c:url value="/avatar/${imovel.codImovel}"/>" width="65" height="55"/> </a></display:column> 
</c:if>
Guevara

Oi cinei!!
Infelizmente acusa o erro com o avatar. Pelo que eu entendi, ele quer converter avatar que é bigint (1) no banco para string na jsp, por isso o problema. Mas o mais estranho é que acabei de testar o imovel com e sem avatar, se tiver avatar não dá nenhum problema, os dados e o avatar aparecem, se o imovel nao tiver avatar, dá o erro que postei lá em cima. Nem era pra dar a zica, já que está pegando atributo avatar e não coluna avatar no banco. "/

cinei

Meu <c:if test="${imovel.avatar.idFoto !== null}"> está com um “=” a mais. O correto é <c:if test="${imovel.avatar.idFoto != null}">

Mas parece que não é o seu problema.

Guevara

O problema é com a palavra “avatar” na jsp, está interpretando td errado, parece argentino, é um inglês que fala espanhol e pensa que é francês. =/

Lucas_Cavalcanti

vê se dentro do display-tag o ${imovel} é um imóvel mesmo, ou é um número

Guevara

Lucas, no breakpoint aparecem várias informações, mas pra achar o que têm dentro de {imovel} tá complicado. Ainda não achei.=/

Lucas_Cavalcanti

só colocar ${imovel} em alguma parte da página…

faça um display-tag mais simples pra ver se tá funcionando, e vá colocando as coisas aos poucos pra ver o que tá gerando o erro

Guevara

Já descobri onde está o problema, a mensagem na JSP está errada, o problema é na Criteria:

public List<Imovel> listaVenda() {		 		 
		Criteria crit = session.createCriteria(Imovel.class);
		crit.add(Restrictions.isNotNull("avatar")); // Aqui era o problema
		Criteria tipoCrit = crit.createCriteria("modalidade");
		tipoCrit.add(Restrictions.eq("tipoModalidade", "Venda"));
		crit.addOrder(Order.desc("dataInclusao"));
		return crit.list(); 
	}

O teste estava certo, é:

<c:when test="${imovel.avatar.idFoto eq null}">

Éra justamente na hora de checar se o avatar está vazio ou não na Criteria. Só que se não tiver foto como avatar continua dando o erro.

Guevara

Com uma Criteria simples de listagem, sem fazer join funciona normal sem erro na jsp, lista os dois imoveis com imagem de “sem avatar”.

public List<Imovel> lista() {
		return session.createCriteria(Imovel.class)		
		.addOrder(Order.desc("dataInclusao")).list();
	}

O problema é aqui:

crit.add(Restrictions.isNotNull("avatar"));

Tentei com:

crit.add(Restrictions.isNotEmpty("avatar"));

O resultado é:

root cause

org.hibernate.MappingException: Property path [br.com.imobiliaria.bean.Imovel.avatar] does not reference a collection

Fiquei sem opções para filtrar imóveis que não tenham avatar. O.o

Lucas_Cavalcanti

use hql:

"from Imovel i where i.avatar.id is not null order by dataInclusao desc"
Guevara

É bug! :smiley:

public List<Imovel> listaVenda() {		 		 
		Criteria crit = session.createCriteria(Imovel.class);
		crit.add(Restrictions.isNull("avatar")); // Pego os imoveis que não têm avatar
		Criteria tipoCrit = crit.createCriteria("modalidade");
		tipoCrit.add(Restrictions.eq("tipoModalidade", "Venda"));
		crit.addOrder(Order.desc("dataInclusao"));
		return crit.list(); 
	}

Resultado correto, lista imóveis para venda e que não possuem avatar:

Agora a zica:

public List<Imovel> listaVenda() {		 		 
		Criteria crit = session.createCriteria(Imovel.class);
		crit.add(Restrictions.isNotNull("avatar")); // Quero que liste os imoveis cujo avatar não sejam nulos, ou melhor, imovel que tenha avatar
		Criteria tipoCrit = crit.createCriteria("modalidade");
		tipoCrit.add(Restrictions.eq("tipoModalidade", "Venda"));
		crit.addOrder(Order.desc("dataInclusao"));
		return crit.list(); 
	}

Ai tomo a exception:

root cause

org.apache.jasper.JasperException: java.lang.NumberFormatException: For input string: "avatar"

Tá errado isso ai não? Era pra não retornar resultado algum e não mandar essa exception doida ai.

Lucas_Cavalcanti

hql ia ficar bem mais legível, não acha? :wink:

Guevara

Olha ai Lucas! :smiley:

public List<Imovel> listaVenda() {	
Query query = this.session.
 createQuery("from Imovel i, Modalidade m where i.avatar.id is not null and m.tipoModalidade = 'venda' order by i.dataInclusao desc");
return query.list();

Se eu não errei na query, está ocorrendo o mesmo erro:

root cause

java.lang.NumberFormatException: For input string: "avatar"

Isso ocorre efetuando este teste:

<c:when test="${imovel.avatar.idFoto eq null}">

Têm alguma coisa errada na parada, nem com HQL a query ao invés de não retornar nada, está retornando essa exception.
Vou tentar a sua dica de pegar os valores soltos na jsp.
Abraço!

Guevara

Cheguei a seguinte conclusão, como o teste na jsp está encrencando com a consulta no banco, deixei a Criteria e removi o teste da jsp, o fato de que Imovel sem avatar não será listado torna-se desnecessário fazer teste de avatar da jsp.
Como esta consulta é para a view do visitante, não seria legal mostrar imóvel sem avatar, por outro lado, se quiserem ver a lista de todos os imóveis mesmo sem avatar, posso remover só a restrição isNotNull() da Criteria e voltar com o testa na JSP.
Pronto, resolvido. :smiley:
Valeu pela força Lucas! o/
obs: a exception continua se não houver imovel cadastrado para venda ou aluguel, de acordo com a Criteria postada, só pode ser bug mesmo. Vou deixar o tópico como resolvido enquanto tento achar uma solução definitiva.

Lucas_Cavalcanti

no imovel.getAvatar() ou no avatar.getIdFoto() vc faz alguma coisa alem de retornar os objetos?

e de novo: na jsp vc não compara com null! vc usa o empty

Guevara

Oi Lucas!
Só retorno objeto na classe Imovel:

public Foto getAvatar() {
		return avatar;
	}

	public void setAvatar(Foto avatar) {
		this.avatar = avatar;
	}
public List<Imovel> listaVenda() {			
		Criteria crit = session.createCriteria(Imovel.class);
		crit.add(Restrictions.isNotNull("avatar"));
		Criteria tipoCrit = crit.createCriteria("modalidade");
		tipoCrit.add(Restrictions.eq("tipoModalidade", "Venda"));
		crit.addOrder(Order.desc("dataInclusao"));
		List results = crit.list();
		return results;
	}

O teste está funcionando na JSP para essa lista de venda, mas no de aluguel que não há imóvel cadastrado lança a exception.
Saca só a stacktrace para aluguel:

11:20:55,885 DEBUG [ExecuteMethodInterceptor] Invoking IndexController.listaAluguel()
Hibernate: 
    select
        this_.cod_imovel as cod1_28_6_,
        this_.area as area28_6_,
        this_.avatar_id_foto as avatar9_28_6_,
        this_.data_inclusao as data3_28_6_,
        this_.descricao as descricao28_6_,
        this_.id_endereco as id10_28_6_,
        this_.medida as medida28_6_,
        this_.cod_modalidade as cod11_28_6_,
        this_.proprietario_id_proprietario as proprie12_28_6_,
        this_.quartos as quartos28_6_,
        this_.codigo_status as codigo13_28_6_,
        this_.cod_tipo as cod14_28_6_,
        this_.titulo as titulo28_6_,
        this_.valor as valor28_6_,
        foto3_.id_foto as id1_31_0_,
        foto3_.descricao as descricao31_0_,
        foto3_.imovel_cod_imovel as imovel5_31_0_,
        foto3_.nome as nome31_0_,
        foto3_.url_foto as url4_31_0_,
        endereco4_.id_endereco as id1_26_1_,
        endereco4_.bairro as bairro26_1_,
        endereco4_.cep as cep26_1_,
        endereco4_.cidade as cidade26_1_,
        endereco4_.complemento as compleme5_26_1_,
        endereco4_.estado as estado26_1_,
        endereco4_.logradouro as logradouro26_1_,
        endereco4_.numero as numero26_1_,
        endereco4_.pais as pais26_1_,
        modalidade1_.cod_modalidade as cod1_33_2_,
        modalidade1_.tipo_modalidade as tipo2_33_2_,
        proprietar6_.id_proprietario as id1_32_3_,
        proprietar6_.data_inclusao as data2_32_3_,
        proprietar6_.email as email32_3_,
        proprietar6_.id_endereco as id4_32_3_,
        proprietar6_.id_pessoa as id5_32_3_,
        status7_.codigo_status as codigo1_35_4_,
        status7_.nome as nome35_4_,
        tipo8_.cod_tipo as cod1_34_5_,
        tipo8_.nome as nome34_5_ 
    from
        Imovel this_ 
    left outer join
        Foto foto3_ 
            on this_.avatar_id_foto=foto3_.id_foto 
    left outer join
        Endereco endereco4_ 
            on this_.id_endereco=endereco4_.id_endereco 
    inner join
        Modalidade modalidade1_ 
            on this_.cod_modalidade=modalidade1_.cod_modalidade 
    left outer join
        Proprietario proprietar6_ 
            on this_.proprietario_id_proprietario=proprietar6_.id_proprietario 
    left outer join
        Status status7_ 
            on this_.codigo_status=status7_.codigo_status 
    left outer join
        Tipo tipo8_ 
            on this_.cod_tipo=tipo8_.cod_tipo 
    where
        this_.avatar_id_foto is not null 
        and modalidade1_.tipo_modalidade=? 
    order by
        this_.data_inclusao desc
11:20:55,926 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor OutjectResult
11:20:55,934 DEBUG [ToInstantiateInterceptorHandler] Invoking interceptor ForwardToDefaultViewInterceptor
11:20:55,935 DEBUG [ForwardToDefaultViewInterceptor] forwarding to the dafault page for this logic
11:20:55,948 DEBUG [DefaultPageResult   ] forwarding to /WEB-INF/jsp/index/listaAluguel.jsp
11:20:55,949 DEBUG [DefaultStaticContentHandler] Deferring request to container: /imobiliaria/WEB-INF/jsp/index/listaAluguel.jsp

Tá apontando pra pegar todos os dados direito. Essa ausência do imóvel que está provocando o erro.
Abraço!

Guevara

Lucas, o problema é com a JSP, olha como eu consegui fazer o teste:

<c:when test="${param.imovel.avatar.idFoto}">

Agora tá acusando erro com o codigo do imovel. O.o

exception

br.com.caelum.vraptor.view.ResultException: org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/jsp/index/listaVenda.jsp at line 23

// esta é a linha
<display:column><a href="/imobiliaria/index/visualizar?codImovel=${imovel.codImovel}"><img src="<c:url value="/avatar/${imovel.codImovel}"/>" width="65" height="55"/></a></display:column>


root cause

java.lang.NumberFormatException: For input string: "codImovel"

Testando com <c:foreach> fora do displaytag, mostra que a jsp está dando problema especificamente com esta linha:

<a href="/imobiliaria/index/visualizar?codImovel=${imovel.codImovel}">

O que poderia causar alergia a números na JSP?
Abraço!

Lucas_Cavalcanti

meu chute seria que a variável imovel é uma List… daí qdo vc faz imovel.codImovel ele faz na verdade imovel[‘codImovel’], por isso o numberFormatException

tenta ver se ele é uma list mesmo

Guevara

Estou mandando a lista assim:

public void listaVenda() {
		result.include("imovel", imovelDao.listaVenda());
	}

E pego no displaytag assim:

<display:table name="${imovel}" id="imovel" requestURI="/imobiliaria/imovel/listaVenda">  
<display:column property="codImovel" title="Código" />
</display:table>

É ai o problema?

Lucas_Cavalcanti

sim… use nomes diferentes pra lista, e pro elemento da lista

Guevara

Já não tô entendo mais como funciona essa lista, cada hora se comporta de um jeito.
Coloquei lá no Controller:

public void listaVenda() {
		result.include("imoveis", imovelDao.listaAluguel());
	}

E ja JSP pra pegar os dados coloquei um <c:foreach>:

<table>
    <tr>
    <td width="50">C&oacute;digo</td>   
    <td width="50">avatar</td>    
    </tr>  
<c:forEach var="imovel" items="${imovel}">
    <tr>      
        <td>${imovel.codImovel }</td>
        <td>${imovel.avatar.idFoto }</td>
      
    </tr>
</c:forEach>
 </table>

E mostrou os dados, como é que pode? Coloquei “imoveis” no Controller e ${imovel} na JSP. O.o
Ai tentei com items="${imoveis}" e items="${imoveisList}". Nada apareceu.
Valeu!!

Lucas_Cavalcanti

vc tah acessando com a lógica certa?

se vc deu um include em “imoveis” deveria usar ${imoveis} na jsp…

vc pode estar com caches no seu servidor, então talvez sua jsp esteja usando a lógica antiga, tenta dar um clean no servidor e um no eclipse

[]'s

Guevara

Oi Lucas!
Dei um clean e limpei o work directory do tomcat.
Tá mostrando os dados com qualquer coisa que eu coloque no Controller, só não posso alterar items="${imovel}" na jsp:

public void listaAluguel() {
		result.include("imo", imovelDao.listaAluguel());
	}

Até com “imo” os dados são mostrados.

<table>
    <tr>
    <td width="100">C&oacute;digo</td>   
    <td width="100">avatar</td>    
    </tr>  
<c:forEach var="imovel" items="${imovel}">
    <tr>      
        <td>${imovel.codImovel }</td>
        <td>${imovel.avatar.idFoto }</td>
      
    </tr>
</c:forEach>
 </table>

Tô desconfiando do result.include agora. "/
Abraço!

Lucas_Cavalcanti

tire o result.include. ve se continua funcionando…
se sim, vc tah mexendo na lógica errada

Guevara

Era isso mesmo Lucas, estava mexendo no método do Controller errado. :oops:
Agora sim, o teste está funcionando com:

<c:when test="${empty imovel.avatar.idFoto}">

E pego no displaytag desta forma:

<display:table name="${imoveis}" pagesize="5" id="imovel" requestURI="/imobiliaria/imovel/listaAluguel">

O problema era nome repetido para pegar os parâmetros --> name="${imovel}". O certo é name="${imoveis}", mesmo nome no result.include no Controller.
Tópico resolvido.
Valeu!!! \o/
Abraço!

Criado 13 de setembro de 2010
Ultima resposta 15 de set. de 2010
Respostas 27
Participantes 3