Não consigo carregar os dados de um MB ou DAO para a tela em JSF

02/09/2009

Boa tarde caros amigos da Devmedia, gostaria de explicar o problema. É o seguinte ,andei vendo e assistindo as aulas da devmedia, sobre jsf e jpa, e fui exercitando. Porém me encontro num problema e tanto.

Eu tenho minha entidade:

@Entity
@Table(name = "[DADOS DO SERVIDOR]")
public class Pessoa implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "Ds_Login")
    private String login;
    @Column(name = "MATRÍCULA")
    private String matricula;
    @Column(name = "NOME")
    private String nome;
    @Column(name = "[UNIDADE DE EXERCÍCIO]")
    private String setor;

    /**
     * Construtor padrão
     */
    public Pessoa() {

    }

    /**
     * @param login
     */
    public Pessoa(String login) {

        this.login = login;
    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome
     *            the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @param matricula
     *            the matricula to set
     */
    public void setMatricula(String matricula) {
        this.matricula = matricula;
    }

    /**
     * @return the matricula
     */
    public String getMatricula() {
        return matricula;
    }

    /**
     * @param login
     *            the login to set
     */
    public void setLogin(String login) {
        this.login = login;
    }

    /**
     * @return the login
     */
    public String getLogin() {
        return login;
    }

    /**
     * @param setor
     *            the setor to set
     */
    public void setSetor(String setor) {
        this.setor = setor;
    }

    /**
     * @return the setor
     */
    public String getSetor() {
        return setor;
    }

}


tenho meu dao

public class PessoaDAO {

    public PessoaDAO() {

    }

    public Pessoa obterPessoa(String login) {
       
       

        return JPAUtil.getInstance().getEntity(Pessoa.class,login);

    }

}


e aqui tenho MB que é onde eu devo estar errando provavelmente. Isso é só a nível de teste. Pois o meu desejo é obter os dados do usuário a partir do usuário que estar logado.

public class PessoaMB implements java.io.Serializable {

    private static final long serialVersionUID = 1L;
    private final PessoaDAO dao = new PessoaDAO();
    private Pessoa pessoa;
    //String login = System.getProperty("user.name");
   
    public PessoaMB() {
       
        pessoa = dao.obterPessoa("anamel");
   
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }

    public Pessoa getPessoa() {


           
            pessoa = dao.obterPessoa("anamel");
       

        return pessoa;
       
    }

   
}

e aqui minha pagina de saida de dados:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<head></head>
<body>
<f:view>
    <h:form>
    <h:dataTable var="pessoa" value="#{pessoaMB.pessoa}">
    <h:column>
     <f:facet name="header">
     <h:outputText value="nome" />
     </f:facet>
     <h:outputText value="#{pessoa.nome}" />
     </h:column>
    </h:dataTable>
    </h:form>
</f:view>
</body>
</html>


Porém não retorna nada na página. E nem da erro.
Euclides Filizola

Euclides Filizola

Curtidas 0

Respostas

Henrique Weissmann

Henrique Weissmann

02/09/2009

Olá Euclides,
bem: vamos lá. Primeiro pela pergunta mais tola ok?
Tem certeza de que existe uma pessoa cadastrada no seu sistema com o login "anamel"? 
Dica: crie um teste unitário no seu sistema que faça a busca por este usuário antes de passá-lo para a sua página jsf. Assim esta parte do problema é descartada ok?
Agora, vamos para a segunda parte do problema: edite a sua página para que imprima alguma coisa independente de haver dados no managed bean ou não, algo como no exemplo abaixo:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<head></head>
<body>
<f:view><h:outputText value="Qualquer coisa"/>
<h:form>
<h:dataTable var="pessoa" value="#{pessoaMB.pessoa}">
<h:column>
<f:facet name="header">
<h:outputText value="nome" />
</f:facet>
<h:outputText value="#{pessoa.nome}" />
</h:column>
</h:dataTable>
</h:form>
</f:view>
</body>
</html>

Se este "qualquer coisa" não aparecer, neste caso é sinal de que a sua aplicação não está bem configurada, o que resultaria na não exibição do conteúdo da página.

GOSTEI 0
Euclides Filizola

Euclides Filizola

02/09/2009

Opa Henrique, agradeço ae a atenção. Amigo, existe sim a pessoa com login 'anamel'. Era apenas um teste. Deixa eu te explicar uma coisa.  Fiz essa classe de teste:

public class Teste {

    public Teste() {
       
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
       
        //String login = System.getProperty("user.name");
       
         EntityManagerFactory     emf = Persistence.createEntityManagerFactory("BDSERV");

         
         EntityManager em = emf.createEntityManager();
         
         em.getTransaction().begin();
         
         Pessoa pessoa = em.find(Pessoa.class, "anamel");
         
         em.getTransaction().commit();
         
         System.out.println("Nome: "+pessoa.getNome());
         
         System.out.println("Matricula: "+pessoa.getMatricula());
         
         System.out.println("SETOR: "+pessoa.getSetor());
         
         em.close();
         
         emf.close();
           
    }

}


E ela funciona perfeitamente, ou seja, com o meu usuario logado ela funciona e tudo, me traz os dados ( significa que minha configuração em relação a persistencia, acredito eu , que esteja funcionando).
Outra coisa, o banco o qual estou tentando acessar é sql Server, então não sei se tem um tratamento diferente. Enfim,

agora apareceu o seguinte erro:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select pessoa0_.Ds_Login as Ds1_0_0_, pessoa0_.MATRÍCULA as MATRÍCULA0_0_, pessoa0_.NOME as NOME0_0_, pessoa0_.[UNIDADE DE EXERCÍCIO] as UNIDADE4_0_0_ from [DADOS DO SERVIDOR] pessoa0_ where pessoa0_.Ds_Login=?
Hibernate: select pessoa0_.Ds_Login as Ds1_0_0_, pessoa0_.MATRÍCULA as MATRÍCULA0_0_, pessoa0_.NOME as NOME0_0_, pessoa0_.[UNIDADE DE EXERCÍCIO] as UNIDADE4_0_0_ from [DADOS DO SERVIDOR] pessoa0_ where pessoa0_.Ds_Login=?
02/09/2009 14:26:51 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.sql.Result
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at javax.faces.component.UIData.getDataModel(UIData.java:1140)
    at javax.faces.component.UIData.setRowIndex(UIData.java:451)
    at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:77)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:813)
    at javax.faces.component.UIData.encodeBegin(UIData.java:967)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:928)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:148)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:837)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:930)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:933)
    at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:578)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:110)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    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:293)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:574)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1527)
    at java.lang.Thread.run(Unknown Source)


Detalhe, essa sql aqui:

Hibernate: select pessoa0_.Ds_Login as Ds1_0_0_, pessoa0_.MATRÍCULA as MATRÍCULA0_0_, pessoa0_.NOME as NOME0_0_, pessoa0_.[UNIDADE DE EXERCÍCIO] as UNIDADE4_0_0_ from [DADOS DO SERVIDOR] pessoa0_ where pessoa0_.Ds_Login=?

se eu executar no banco, ela funciona beleza, desde que eu utilize aspas simples depois do = .

como exemplo:

select pessoa0_.Ds_Login as Ds1_0_0_, pessoa0_.MATRÍCULA as MATRÍCULA0_0_, pessoa0_.NOME as NOME0_0_, pessoa0_.[UNIDADE DE EXERCÍCIO] as UNIDADE4_0_0_ from [DADOS DO SERVIDOR] pessoa0_ where pessoa0_.Ds_Login= 'anamel'.
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

02/09/2009

Estão faltando arquivos jar no classpath do seu sistema. No caso, na sua camada de apresentação.
Veja aqui o erro: java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.sql.Result

No caso, o seu sistema ema lgum lugar utiliza as tags presentes no JSTL. Se não me engano, o nome do arquivo é jstl.jar ou standard.jar. Verifique se estes se encontram dentro do seu classpath ou entre as bibliotecas utilizadas pelo seu projeto (caso esteja usando uma IDE). Isto explica o porquê de nada estar sendo renderizado para você.
Para saber o nome do arquivo jar com maior precisão, recomendo o uso de ferramentas como o site JarFinder (www.jarfinder.com), aonde você digita o nome da classe e ele te retorna uma série de nomes de arquivos jar aonde o mesmo se encontra.
GOSTEI 0
Euclides Filizola

Euclides Filizola

02/09/2009

Olha as libs que estou carregando.


GOSTEI 0
Henrique Weissmann

Henrique Weissmann

02/09/2009

Euclides,
a jstl está listada pelo que pude ver. Faça o seguinte: verifique se ela está sendo incluida no seu arquivo .war também. Caso não seja o caso, faça com que a mesma seja incluida.
Isto deverá solucionar o problema. Como seguro morreu de velho, sugiro novamente que você verifique no www.jarfinder.com se a classe pode estar em outro local também (nada impede que o seu jar contenha apenas as interfaces da biblioteca).
GOSTEI 0
Euclides Filizola

Euclides Filizola

02/09/2009

Problema resolvido. Eu peguei a biblioteca jstl-2.4.jar  do site: http://www.java2s.com/Code/Jar/CatalogJar.htm.  e coloquei para rodar dentro do meu servidor web, dentro de lib do tomcat. E funcionou. Obrigado pela atenção. Abraços.
GOSTEI 0
Euclides Filizola

Euclides Filizola

02/09/2009

Só uma dúvida, porque que dentro da minha pasta web/lib, eu tinha essa mesma biblioteca e não funcionava ? O que mais eu precisava fazer ? Pode me explicar ? Agradeço desde já. Abraços.
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

02/09/2009

Euclides,
não tenho certeza, porém uma causa comum consiste no fato do jar distribuido com a aplicação conter apenas as interfaces de referência, e não as classes já implementadas.
Sendo assim, quando vai ser criada uma nova instância da classe, a JVM encontra apenas a definição da interface, e não a implementação da mesma. Como consequência, obtem-se o erro de ClassNotFound.
Esta é uma das razões, outra pode ser também a presença da mesma classe em mais de um arquivo jar dentro do seu classpath. A JVM nestes casos não vai saber qual dos arquivos de classe deverá ser instanciado e, pior ainda neste caso, pode instanciar uma versão errada da mesma.
GOSTEI 0
POSTAR