Problema ao iterar com dataTable do JSF ServletException: For input string

6 respostas
D

Olá colegas, sou novo por aqui

Depois de tentar por mais de um dia resolver um problema, vim pedir ajuda

Segue o código

CLASSE BAIRRO

package DeltaEscolarWeb.EntityPojo;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Bairro implements Serializable {

    private static final long serialVersionUID = 1L;
    //@Column(insertable=false)
    //@SequenceGenerator( name = "BAIRRO_SEQ", sequenceName = "S_BAIRRO", allocationSize = 1 )
    //@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BAIRRO_SEQ")
    @Id
    private long CODIGO;
    private String BAIRRO;

    public String getBAIRRO() {
        return BAIRRO;
    }

    public void setBAIRRO(String BAIRRO) {
        this.BAIRRO = BAIRRO;
    }

    public long getCODIGO() {
        return CODIGO;
    }

    public void setCODIGO(long CODIGO) {
        this.CODIGO = CODIGO;
    }
}

CLASSE BAIRRODAO

package DeltaEscolarWeb.PersistenceDao;

import DeltaEscolarWeb.EntityPojo.Bairro;
import DeltaEscolarWeb.HibernateConnection.HibernateConnection;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

public class BairroDao {

    private Session session;

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

    public BairroDao() {
        this.session = HibernateConnection.getInstance().getSessionWithBeginTransaction();
    }

    private long novoCodigo() {
       Session ses = HibernateConnection.getInstance().getSessionWithBeginTransaction();
       Query query = ses.createSQLQuery("SELECT NEXT VALUE FOR S_BAIRRO FROM RDB$DATABASE");
       return Long.parseLong(query.uniqueResult().toString());
    }

    public boolean Inserir(Bairro bairro) {
        Session s = HibernateConnection.getInstance().getSessionWithBeginTransaction();
        try {
            System.out.println("cheguei no insert do dao");
            bairro.setCODIGO(novoCodigo());
            s.persist(bairro);
            s.getTransaction().commit();
            s.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            s.getTransaction().rollback();
            return false;
        }
    }

    public List<Bairro> ListaByCodigo(Bairro bairro) {
        Session s = HibernateConnection.getInstance().getSessionWithBeginTransaction();
        System.out.println("cheguei ao ListaByCodigo do dao");
        Query query = s.createSQLQuery("SELECT * FROM BAIRRO WHERE BAIRRO.CODIGO=" + bairro.getCODIGO());
        List<Bairro> Lista = query.list();
        s.getTransaction().commit();
        s.close();
        return Lista;
    }

    public List<Bairro> ListaTodos() {
        Session s = HibernateConnection.getInstance().getSessionWithBeginTransaction();
        System.out.println("cheguei ao ListaTodos do dao");
        Query query = s.createSQLQuery("SELECT * FROM BAIRRO");
        List<Bairro> Lista = query.list();
        s.getTransaction().commit();
        s.close();
        return Lista;
    } 
}

CLASSE BAIRROBEAN

package JavaBeans;

import DeltaEscolarWeb.PersistenceDao.BairroDao;
import DeltaEscolarWeb.EntityPojo.Bairro;
import java.util.List;

public class BairroBean {

    private BairroDao bairrodao = new BairroDao();
    private Bairro bairro = new Bairro();
    private List<Bairro> lst;

    public BairroBean() {
    }

    public Bairro getBairro() {
        return bairro;
    }

    public void setBairro(Bairro bairro) {
        this.bairro = bairro;
    }

    public String Inserir() {
        System.out.println("cheguei no inserir do bean");
        if (bairrodao.Inserir(bairro) == true) {
            return "case1";
        } else {
            return "case2";
        }
    }

    public List<Bairro> getLst() {
        System.out.println("cheguei no getLista do bean");
        lst = bairrodao.ListaTodos();
        if (lst.isEmpty()) {
          System.out.println("lista vazia");
        } else {
            System.out.println("lista com conteudo");
        }
        return lst;
    }

    public void setLst(List<Bairro> lst) {
        this.lst = lst;
    }

  /*  public List<Bairro> getLista() {
        System.out.println("cheguei no getByCodigo do bean");
        lista = bairrodao.ListaByCodigo(bairro);
        if (lista.isEmpty()) {
          System.out.println("lista vazia");
        } else {
            System.out.println("lista com conteudo");
        }
        return lista;
    }  */

}

PÁGINA JSF

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<%--
    This file is an entry point for JavaServer Faces application.
--%>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <f:view>
            <h:dataTable var="Bairro" value="#{BairroBean.lst}">
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="BAIRRO"/>
                    </f:facet>
                    <h:outputText value="#{Bairro.BAIRRO}"/>
                </h:column>
            </h:dataTable>
        </f:view>
    </body>
</html>

SAÍDA DO TOMCAT 6.0.18
segue mensagens personalizadas dentro dos métodos:
[color=darkred]cheguei no getLista do bean[/color]
[color=red]cheguei ao ListaTodos do dao[/color]
[color=orange]Hibernate:
SELECT
*
FROM
BAIRRO[/color]
[color=blue]lista com conteudo[/color]

segue mensagem de erro:

25/02/2009 17:43:35 com.sun.faces.lifecycle.LifecycleImpl phase

WARNING: executePhase(RENDER_RESPONSE 6,com.sun.faces.context.FacesContextImpl@19facbc) threw exception

java.lang.NumberFormatException: For input string: BAIRRO

at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)

at java.lang.Integer.parseInt(Integer.java:447)

at java.lang.Integer.parseInt(Integer.java:497)

at javax.el.ArrayELResolver.coerce(ArrayELResolver.java:153)

at javax.el.ArrayELResolver.getValue(ArrayELResolver.java:45)

at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)

at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64)

at org.apache.el.parser.AstValue.getValue(AstValue.java:118)

at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)

at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101)

at javax.faces.component.UIOutput.getValue(UIOutput.java:173)

at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getValue(HtmlBasicInputRenderer.java:189)

at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getCurrentValue(HtmlBasicRenderer.java:320)

at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeEnd(HtmlBasicRenderer.java:200)

at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:836)

at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:279)

at com.sun.faces.renderkit.html_basic.TableRenderer.encodeChildren(TableRenderer.java:307)

at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)

at javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)

at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)

at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:245)

at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:176)

at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)

at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)

at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)

at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)

at java.lang.Thread.run(Thread.java:619)

Devido ao fato de não ter experiência posso estar comentendo erros banais

O que pode ser? podemos acompanhar pelas mensagens que coloquei nos métodos que eles parecem estar funcionando corretamente
Mas pelo fato de que estou usando createSQLQuery do hibernate, pensei que este não está devolvendo uma lista compatível com o dataTable do JSF
Então o que está errado, porque não está iterando?

Agradeço por qualquer ajuda

6 Respostas

thimor

Provavelmente esta ocorrendo algum problema de mapeamento dos campos. O cabo bairro esta passando um valor de string para um campo numerico. Nas classes estao todos certos. Olhe nos seus .xml do hibernate. Coloque uma estrategia de geracao do ID e nao use os nomes maiusculos. use os padroes da especificacao java.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long codigo;
private String bairro;

public String getBairro() {
    return bairro;
}

public Long getCodigo() {
    return bairro;
}
D

String Bairro está sem mapeamento é assim mesmo???
Acho que vc não está inserido o nome do bairro no banco, por isso tá dando erro no datatable.

D

Não sei se poderia ser problema de mapeamento, pois a inserção está funcionando corretamente, mas vamos examinar e identificar as colunas com os nomes usados no DB

O cabo bairro esta passando um valor de string para um campo numerico
.
onde?

Não uso xml do hibernate, tenho uma classe singleton que cria uma instancia do hibernate e informa os POJOS “anotados”
Essa classe foi submetida a um teste e também funciona corretamente.

Ambas funcionam

opção A)

private long novoCodigo() {  
    Session ses = HibernateConnection.getInstance().getSessionWithBeginTransaction();  
    Query query = ses.createSQLQuery("SELECT NEXT VALUE FOR S_BAIRRO FROM RDB$DATABASE");  
    return Long.parseLong(query.uniqueResult().toString());  
 }

opção B) está comentada, estou usando a opção A, pois assim consigo criar a chave fora do controle do hibernate e manipular a chave nos objetos

//@SequenceGenerator( name = “BAIRRO_SEQ”, sequenceName = “S_BAIRRO”, allocationSize = 1 )

//@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “BAIRRO_SEQ”)

Correto, estou aprendendo ainda, aos poucos vou me adaptando

D

Sou assinante da javamagazine e tenho visto algumas aulas sem o mapeamento das colunas e AFIRMO que pelo menos a inserção funciona 100% com ambas as soluções citadas na resposta anterior, resta saber se vai funcionar na iteração do dataTable

Está inserindo corretamente, alias, nesta parte fui bem mais feliz.

thimor

Cara,
O erro eu nao sei te dizer exatamente onde esta por que ele esta ocorrendo em uma das fases do jsf. Se fosse no seu codigo daria a classe e a linha do erro. Por isso eu digo que ele esta dando erro quando esta sendo atribuido o valor. Provavelmente o valor do Bairro (CENTRO) por exemplo esta sendo atribuido ao atributo de Codigo. Por isso esta dando o erro. Tente colocar no dataTable os dois campos. Codigo e Nome so para visualizar se apresenta o erro.

D

Colegas, criei outra lista a título de teste chamada ls dentro do meu BairroBean, segue o código:

private List<Bairro> ls;

    public BairroBean() {
        ls = new LinkedList<Bairro>();
        ls.add(new Bairro(2000, "ABCD"));
        ls.add(new Bairro(2001, "ABCD1"));
        ls.add(new Bairro(2002, "ABCD2"));
        ls.add(new Bairro(2003, "ABCD3"));
    }

    public List<Bairro> getLs() {
        return ls;
    }

    public void setLs(List<Bairro> ls) {
        this.ls = ls;
    }

Pelo depurador observei que a lista ls retorna itens do tipo Bairro conforme a imagem abaixo e a página JSP contento o DataTable ixibe corretamente os itens:

[img]http://www.deltacorp.com.br/guj/imagem1.jpg[/img]

Por outro lado usando o depurador observei que createSQLQuery e seu método list() não está retornando itens do tipo Bairro e sim Objetos conforme a imagem abaixo:

[img]http://www.deltacorp.com.br/guj/imagem2.jpg[/img]

Então creio ser este o problema da página JSP não conseguir iterar os itens em DataTable, mas ainda preciso da ajuda de vocês para descobrir uma maneira de fazer com que o método list() me retorne itens do tipo Bairro.

Obrigado por qualquer ajuda.
Aguardo!

Criado 25 de fevereiro de 2009
Ultima resposta 26 de fev. de 2009
Respostas 6
Participantes 3