Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate

Olá, tudo bem?

Nesse post comemorativo de 100.000 visitas será descrita uma aplicação web completa. O post de hoje utilizará as seguintes tecnologias: Tomcat7, JSF 2 (Facelets e Libraries) com Primefaces (utilizando AutoComplete), JPA / Hibernate (com relacionamento NxN), Login por Filter.

Caso você queira ver uma aplicação completa utilizando JSF + EJB + JPA + JAAS + JBoss 7 clique aqui.

Para o projeto de hoje você precisará dos artefatos abaixo (todos os JARs você encontra com o código fonte disponível na última página):

O banco utilizado foi o Postgres, mas você pode utilizar qualquer um. Basta alterar o driver e a url de conexão do arquivo persistence.xml.

Ao final desse post você irá encontrar o código fonte juntamente com as bibliotecas utilizadas no projeto.

O que será visto em cada página:

  • Página 02: Modelo mapeado com anotações JPA. Utilização do relacionamento NxN (@ManyToMany) , NamedQueries utilizando Join Fetch e Enum como atributo.
  • Página 03: DAO Genérico, controle de transação, utilizar métodos genéricos que preencham os parâmetros de uma query.
  • Página 04: Façades utilizando transações, utilizar método findReferenceOnly, cuidados ao utilizar o comando entityManager.merge().
  • Página 05: Filters.
  • Página 06: ManagedBeans. Injetar um ManagedBean dentro de outro, observações sobre @ViewScoped.
  • Página 07: JSFMessageUtil.
  • Página 08: Arquivos de configurações: log4j.properties, messages.properties.
  • Página 09: xhtml pages, Facelets.
  • Página 10: Primefaces AutoComplete, JSF Converter utilizando “forClass”.
  • Página 11: Facilitando o uso de CSS/javascript/imagens com JSF.
  • Página 12: Configurações “web.xml”.
  • Página 13: Práticas para um programa mais seguro.
  • Página 14: Executando a aplicação
  • Página 15: BUG_FIX

A aplicação de hoje terá um cadastro de pessoas e cachorros onde apenas o ADMIN poderá cadastrar os cachorros. Antes de executar o projeto crie o banco de dados: “JSFCrudDB”.

322 thoughts on “Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate

  1. Parabéns mais uma vez, dessa vez em dobro, pelos pageviews e pelo post que com certeza irá ajudar muito em meus estudos.

    Forte abraço e sucesso sempre!

    • Rich, boa noite.

      Obrigado pelo apoio.

      Em 2 ou 3 meses já devo ter uma base boa de Spring para criar um post a utilizá-lo. [=

      Inté+! o_

  2. Ótima publicação jake, iniciativa 10.000 e conhecimento 1.000.000! Que outras 100.000 visitas venham logo para outras liberações com esse grau de qualidade para a comunidade.

    Abraços

    André Fróes

  3. Como sempre digo aos meus colegas tu é o meu guru,
    estava bem afim de fazer um login por filter e sonhava em fazer o autocomplete.
    Parabéns!

  4. Opa, ótimo “artigo”, muito bom!
    Estou começando em JPA, etc e está sendo muito “abridor” de caminhos..
    Só fiquei com uma dúvida (provavelmente de iniciante =P)

    No método findAll e findOneResult do GenericDAO, você utilizou o supressWarning pela falta de um gerResult genérico, mas não poderia ter utilizado antes um createQuery(entityClass) já que no findAll do PersonDAO ele retorna um Person, no do DogDAO um Dog, e assim sucessivamente?
    Ou existe alguma situação que eu desconheço?

    Detalhe: não executei seu projeto ainda porque estou aprendendo e digamos, “extraindo” como utilidade para minha aplicaçãozinha, mas com créditos! =P

    No mais, parabéns..
    estou aprendendo muito com vc!
    Fez mais uma pessoa feliz no mundo

    • Ricardo, bom dia.

      Você está ultra correto. [=

      Essa classe Genérica é a mesma que e uso a muito tempo e ela é feita com base no JPA 1.

      Dois dias depois de lançar esse post eu li no livro de JPA 2 sobre o TypedQuery. =/

      O createQuery que aceita uma classe, salvo engano, foi adicionado no JPA 2, é por isso.

      Pode usar a vontade, como quiser. =D

      Obrigado pela visita e pelo apoio.

    • Olá Gilberto, boa tarde.

      Creio que nada. [=

      Mas eu utilizaria EJB ao invés de controle manual de transação.

      Mas é apenas gosto pessoal. [=

  5. Muito bom, estou somando muito meus conhecimentos com seus posts. Parabéns e obrigado por sua disposição em liberar o material.

  6. Parabéns pelo sucesso e muito obrigado pelos ótimos post’s.
    Explicações fáceis de entender e bem objetivas.
    Estarei aproveitando ao máximo os conhecimentos aqui disponibilizados.

    Obrigado!

  7. Cara, meus parabéns por esse tutorial, fazia tempo que não programava nada, já nem lembrava de muita coisa, esse seu tutorial caiu como uma luva para meu retorno a essa vida!! Obrigadão cara.

    Ps: Tá nos favoritos :D

    • Olá João, bom dia.

      Muito obrigado pelo apoio! [=

      É sempre bom ouvir um feedback, ainda mais quando é positvo! =D

  8. Estou iniciando em Java e Primefaces, notei que os componentes gráficos (botões, grid etc.) são muito grandes.. Consegui importar seu projeto e executá-lo e alterei o template do primefaces baixando o “afterwork” porém os elementos continuam demasiado grande. Na página de demonstração do primefaces não é assim, existe alguma configuração adicional de layout (css) a ser feito, ou algo do tipo?

  9. Parabéns pelos posts, eles me ajudaram muito durante os meus estudos sobre JSF e primefaces. Estou fazendo alguns testes com os themes da themeroller jquery e gostaria de saber se existe uma maneira simples de disponibilizar essas imagens em minha allowedURIs? Como estou fazendo testes com N versões de themes não fica muito prático atribuir cada uma das imagens ao meu allowedURIs. Obrigado

    • André, bom dia.

      Desculpe a demora.

      Eu fiz um outro filter, do seguinte modo: @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      HttpServletRequest httpRequest = (HttpServletRequest) request;

      httpRequest.setCharacterEncoding(ConstantesPalavras.UTF8);

      final String requestedURL = "http://" + httpRequest.getServerName() + ":" + httpRequest.getServerPort() + httpRequest.getRequestURI();

      HttpSession session = httpRequest.getSession();
      Usuario usuario = (Usuario) session.getAttribute(ConstantesUsuario.USUARIO_VALIDADO);

      if (usuario == null || (usuario == null && !isLoginURL(requestedURL, httpRequest))) {
      enviarUsuarioDeVoltaAoLogin(httpRequest, response);
      return;
      }

      chain.doFilter(httpRequest, response);
      }

      Esse código funciona melhor para o caso onde, você não precisa do primefaces na página do login.

      Desse modo, na página de login basta descrever todo o css necessário e uma vez que o usuário faça login não será preciso verificar a URL mais.

      Espero que te ajude. [=

      • Boa tarde,
        Acho que o meu cenário é um pouco diferente. No meu caso possuo uma tela de login que utiliza os temas gerados pela themeroller jquery. Como tenho a possibilidade de escolher entre N temas preciso cadastrar todos os arquivos de css e imagens em minha lista allowedURIs, certo? Gostaria de saber se existe uma forma otimizada de “cadastrar” em minha allowedURIs cada um dos arquivos associados ao meu tema escolhido.

        Muito obrigado
        Abraços
        André

        • André, bom dia.

          Eu teria que analisar seu caso com mais cuidado para pensar em uma maneira otimizada.

          Desculpe por não poder te ajudar com uma resposta simples. [=

          Até a próxima.

  10. Bom dia, parabéns pelo tutorial, realmente está muito bom!
    mas por algum motivo o hibernate não está criando as tabelas no meu banco, creio que é alguma coisa no meu persistence.xml, fiquei em dúvida onde ele teria que ser criado. Criei uma pasta META-INF no meu src pois não tinha e coloquei ele la…

    ta certo isso? se não onde eu coloco?

    Estou usando o MySql…

    org.hibernate.ejb.HibernatePersistence

    []’s

    • Olá Vitor, boa noite.

      Está correto sim.

      Você poderia baixar o código fonte na última página e comparar com o seu. [=

      Aquele código lá eu sei que funciona! ;)

      • Hebert, o tutorial ficou muito bom, parabéns, mas estou com o mesmo problema do Vitor. As tabelas não estão sendo criadas. Até tentei alterar o hibernate.hbm2ddl.auto para “create-drop” mas não deu certo. Sim, estou tentando com o projeto que você disponibilizou para download.

        • Thiago, boa noite.

          Um motivo que eu vejo para o sistema não funciona, seria a URL para o banco de dados.

          Está configurada corretamente? Verifique o log da aplicação e veja se aparece alguma mensagem de erro ao inciar a aplicação.

          Outra coisa, para que a primeira chamada ao hibernate aconteça é necessário ir para a tela de login e pressionar o botão login uma vez. [=

          Obrigado pela visita. [=

  11. Hebert,

    Primeiro de tudo,parabéns pelo site e pelo post, tudo de muita excelência.

    Quanto a aplicação, eu gostaria de fazer uma pergunta: por que você não utilizou o STATE_SAVING_METHOD no web.xml?

    E, se fosse utilizar, qual você recomendaria?

    Abraços!

    • Arthur, boa tarde.

      Esse valor não é obrigatório, e tem como valor default o server.

      A diferença é onde o JSF irá salvar o valor da árvore de componentes.

      A vantagem de salvar no Server é que irá economizar na banda de tráfegos de dados. A desvantagem é que irá ocupar memória do servidor, mas é bem pouca para uma aplicação bem estruturada. (A configuração padrão é de 15 views salvas no PC por usuário)

      A vantagem de salvar no Client é que irá diminuir o uso de memória do servidor e evitar o erro ViewExpiredException caso o usuário abra muitas abas na mesma sessão. A desvantagem é que aumenta o consumo de banda.

      O upload do primefaces (na versão antiga sei que era assim, não sei agora) necessitava que a opções fosse Server para funcionar corretamente.

      Você deve analisar qual se encaixa melhor nas necessidades da sua aplicação e utilizar. [=

      Espero ter ajudado. o_

  12. Nossa uaihebert, isso é um verdadeiro tesouro para quem está começando em Java EE e seus frameworks! Meus parabéns pela iniciativa!

    Bem, tenho uma duvida. Sou iniciante e estou usando a classe DAO genérica que você apresentou no inicio do post.

    Eu não estou conseguido importar a classe import javax.persistence.criteria.CriteriaQuery.

    Ele não está achando o pacote “criteria”, o que eu posso tentar fazer para solucionar o problema?

    Grande abraço!!!

    • João, boa tarde.

      Verifique se a biblioteca do Hibernate está na pasta WebContent/WEB-INF/lib.

      Lembre-se de que o Java é case sensitive, ou seja WEB-INF é diferente de Web-inf

      Faça o download do código que está na última página e confira o que pode estar diferente.

      Obrigado pelo apoio.

  13. Hebert,

    aprendi sobre generic e deu uma boa olhado sobre o servlet Filters.

    Pintou uma duvida que não está clara em minha mente.

    O que realmente o método init() da classe LoginCheckFilter está fazendo?

    O que são essas URI’s e do que se trata esse arquivo “loginActionURI”

    Não entedi o objetivo do método

    Obrigado mais uma vez pela atenção!

    Abraço…

    • João, bom dia.

      O método init é da interface Filter, ele deve ser escrito mesmo que não faça nada.

      URIs são as chamadas que devem ser liberadas para o Primefaces funcionar corretamente.

      Obrigado pela visita.

      • Grande Hebert, me pintou mais uma duvida (espero não estar enchendo o saco rsrs…)

        Estudei sobre o Filter e entendi bem qual o proposito do mesmo no projeto, mas ainda sobre o metodo init() da classe LoginCheckFilter.

        Mudei o caminho para um outro arquivo css que estou usando em meu projeto e quando dou o deploy nele as referencias do primefaces são todas perdidas! Eu apenas mudei o caminho do meu arquivo css
        e os componentes não ficam com o skin padrao do primefaces.

        O que será que está acontecendo? Já tentei uma porção de coisas sem sucesso.

        Abraço…

        • João, boa tarde.

          Note as URLs que estão mapeadas filtro do post.

          Você verá que é exatamente o motivo delas estarem mapeadas lá, para não haver o bloqueio.

          Até mais.

          • Maravilha Hebert mais uma berreira vencida!

            Configurei apenas meu persistence.xml com mapeamentos no proprio POJO e funcionou certinho!

            Ele gera apenas essa exceção quando vou iniciar o tomcat:
            java.lang.NoClassDefFoundError: javax/faces/event/PreDestroyApplicationEvent

            Já tentei resolver, mas adivinhe? Não tive sucesso!

            O que pode ser?

            Mais uma vez obrigado pela força, estou curtindo bastante começar em JAVA!!!

          • Olá João, bom dia.

            Parece que o está faltando a biblioteca do JSF.

            Não sei te falar ao certo pois está meio vaga essa mensagem.

            Até mais. o_

  14. Parabens pelo ótimo post, me ajudou muitíssimo num projeto que estou atualmente.
    Pintou uma duvida: como eu faria para exibir um formulario apenas quando determindada opção de um selectOneRadio fosse escolhida?

  15. Mais um post seu que me ajuda bastante!
    Uaihebert parabéns cara, é muito bom ver um programador que consegue transmitir seus conhecimentos assim.
    Muitas vezes eu vejo programadores mal educados e se achando superiores (especialmente em java) e fico feliz que você não é assim!
    Só tenho uma dúvida, eu preciso informar as URIs permitidas no filter? eu não poderia acrescentar algum código no topo de cada página que controlasse se esta pode ou não ser exibida?
    Obrigado e parabéns mais uma vez!

    • Olá DiDCZ, bom dia.

      Eu não consigo imaginar como fazer igual ao que você sugeriu.

      Uma solução que eu encontrei foi, para o acesso das páginas seguras o usuário deve estar logado, com isso na página de login eu não usei nenhum componente ou css de arquivos. Vou colocar o código abaixo para ver se te ajuda:

      @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      HttpServletRequest httpRequest = (HttpServletRequest) request;

      httpRequest.setCharacterEncoding(ConstantesPalavras.UTF8);

      final String requestedURL = "http://" + httpRequest.getServerName() + ":" + httpRequest.getServerPort() + httpRequest.getRequestURI();

      HttpSession session = httpRequest.getSession();
      Usuario usuario = (Usuario) session.getAttribute(ConstantesPalavras.USUARIO_VALIDADO);

      if (usuario == null || (usuario == null && !isLoginURL(requestedURL, httpRequest))) {
      enviarUsuarioDeVoltaAoLogin(httpRequest, response);
      return;
      }

      chain.doFilter(httpRequest, response);
      }
      Na página de login eu escrevi os css e tudo que era necessário para que o login fosse realizado com sucesso.
      Do modo acima não é necessário adicionar as URIs. Não usei nenhum URL/URI de acesso.

      Espero ter ajudado.

      Obrigado pela ajuda. [=

  16. Hebert,

    qual seria a forma mais fácil (e que siga uma boa pratica) de se alterar a mensagem de campo no ato do login?

    O componente p:growl dispara a seguinte mensagem quando algum campo (e-mail ou senha) está vazio:

    Senha: is empty. Please, provide some value

    Como eu poderia traduzir e/ou deixar como padrão no primeFaces?

    Abraço..

  17. Olá Hebert, tudo beleza??

    Estou tentando implementar o autocomplete do primefaces seguindo o seu exemplo, muito bom por sinal! :D

    mas me surgiu uma dúvida..

    Porque é necessário essa linha? :
    ” allDogs.removeAll(personWithDogs.getDogs()); ”

    Obrigado!!
    Abraçoos

      • Entendi =)
        Alguma vez vc já teve algum problema de ‘funcionamento’ com o autocomplete?

        Tipo, o que está acontecendo aqui é assim.. ele busca no banco certinho os valores para o autocomplete.. quando digito as primeiras letras, ele encontra, porém se apago uma letra, por exemplo, ou digito mais uma, o autocomplete se perde.. não fica com a lista abaixo do campo “filtrando”, ae preciso apagar tudo o que esta nele e digitar novamente..

        se tiver uma idéia do que seja, agradeceria muito!! =D
        Abraçao!

        Adicionado pelo usuário:
        Na verdade acabo de percebe que dentro do Dialog ele se comporta dessa maneira.. se tiro ele do dialog funciona belezinha =/

        • Paulo, boa tarde.

          Nesse caso não sei te falar o motivo.

          Eu teria que realizar uma análise mais profunda do seu código.

          Você poderia ter essa consultaria gratuita no próprio fórum do Primefaces.

          O pessoal é gente boa e sempre ajudam rápido.

          Até mais e obrigado pela visita.

  18. Mensagem editada por uaiHebert:
    uaiHebert,

    nao estou conseguindo logar no sistema. as tabelas foram criadas. entretanto, nao entendi como logar.
    ————–
    descobri como criar. obrigado uaihebert

      • Sergio, bom dia.

        Você inseriu na tabela de usuários, o usuário inicial?

        OBS.: Desculpe se você já respondeu isso, eu não consegui achar o começo da conversa.

        Obrigado pela visita.

  19. UaiHebert,

    Se ficar logado muito tempo, a sessao está expirando. Voce sabe como eu poderia resolver esse problema?

    Obrigado,

    • Marcel, bom dia.

      Você poderia aumentar o tempo da sessão no web.xml com a opção session-config.

      Apenas tome cuidado que isso pode afetar a memória do seu servidor.

      Obrigado pela visita.

  20. Uaihebert,

    Se tivesse que colocar um campo no relacionamento entre as entidades Dog e Person, deveria ser criada uma outra entidade com o nome DogPerson, certo?
    Da forma que voce fez usando as annotations manytomany nao funcionaria, certo?

  21. boa noite Uaihebert,

    Por que voce nao utilizou uma camada de negocio (business object) nesse exemplo? O facade está representanto a camada de negocio? A melhor camada para se colocar as validacoes é no facade?

    • Marcel, boa noite.

      O facade nesse caso representa a camada de negócio.

      Eu optei por essa abordagem apenas para mostrar a necessidade de ser ter um código que seja isolado.

      Caso você queria um MVC puro, ou DDD ou qualquer outra abordagem, o importante é sempre ter em mente que a regra de negócio deve ficar isolada. [=

      Obrigado pela visita

      • Obrigado por responder uaihebert. Entao, nesse caso, o facade pertence a camada model do modelo MVC?

        —— Editado por uaiHebert.com // Motivo: adicionando outra mensagem enviada pelo usuário.

        entao o facade nao está sendo utilizado rigidamente da forma como ele é definido? fiz essa pergunta por que entendi que ele está sendo utilizado de forma identica quando utilizamos o business object para representar a camada de negocio.

        • Marcel, boa tarde.

          Dentro de um MVC sim, o Facade pode ser considerado parte do Modelo.

          Note que o BO tem a mesma função que um Facade. O que muda é apenas a nomenclatura. Eu valorizo mais o desenvolvedor saber separar a regra de negócio (independente se em Facade ou BO) do que saber muitos nomes e não aplicar nada. [=

          Obrigado pela visita.

  22. uaihebert,

    voce postou na primeira pagina que utiliza hibernate no projeto. É que nao estou acostumado a utilizar entitymanager. O entitymanager é uma implementacao do hibernate que segue as definicoes da especificacao jpa, certo?

    abraço,

    • Marcel, boa tarde.

      O EntityManager pertence ao JPA. O Hibernate implementa o JPA.

      Pretendo em duas semanas lançar um novo post sobre JPA. Ele irá explicar melhor sobre isso.

      Obrigado pela visita.

      • Boa noite hebert,

        desculpe o questionamento, mas o JPA nao é apenas uma especificacao sem implementacao? EntityManager nao é uma implementacao?

        • Marcel, bom dia.

          Quando eu disse que o EntityManager pertence ao JPA eu quis dizer a especificação dele.

          O Hibernate além de implementa-lo, ele tem suas próprias classes. Por exemplo, com o Hibernate você pode controlar a transação pelo EntityManager ou pelo Session.

          Obrigado pela visita

  23. Ola Hebert,

    Tenho feito alguns exercicios com o seu exemplo e tenho tido umas dores de cabeça :)

    O metodo incrementar() do botao indicar abaixo nao responde quando eu clico nele. Coloquei dentro do metodo incrementar apenas um System.out.println(“oi”);
    quando clico nele, o “oi” nao é impresso. Entretanto, se eu tirar de dentro da dataTable, o botao funciona. Voce sabe por que?

    Informe o nome de uma empresa

    Nome da Empresa

    Numero de Indicacoes

    Indicar

  24. Oi Hebert.

    Primeiramente parabéns pelo post. Tirou algumas dúvidas que tinha.

    Porém estou com o seguinte problema, baixei o projeto na última página, e no meu caso estou utilizando o banco de dados Oracle e o JBOSS. Para fazer a configuração do banco criei um data-source, no meu arquivo standalone.xml do JBOSS e utilizou ele no meu persistence.xml, ficando assim.

    org.hibernate.ejb.HibernatePersistence
    java:jboss/datasources/RetailXADS

    Porém quando vou fazer o login, está me retornando este erro abaixo:

    10:32:08,843 INFO [stdout] (http-localhost-127.0.0.1-8081-3) Error while running query: Named query not found: User.findUserByEmail

    10:32:08,846 ERROR [stderr] (http-localhost-127.0.0.1-8081-3) java.lang.IllegalArgumentException: Named query not found: User.findUserByEmail

    10:32:08,848 ERROR [stderr] (http-localhost-127.0.0.1-8081-3) at org.hibernate.ejb.AbstractEntityManagerImpl.createNamedQuery(AbstractEntityManagerImpl.java:636)

    10:32:08,849 ERROR [stderr] (http-localhost-127.0.0.1-8081-3) at com.dao.GenericDAO.findOneResult(GenericDAO.java:97)

    10:32:08,851 ERROR [stderr] (http-localhost-127.0.0.1-8081-3) at com.dao.UserDAO.findUserByEmail(UserDAO.java:20)

    10:32:08,852 ERROR [stderr] (http-localhost-127.0.0.1-8081-3) at com.facade.UserFacade.isValidLogin(UserFacade.java:11)

    10:32:08,853 ERROR [stderr] (http-localhost-127.0.0.1-8081-3) at com.mb.LoginMB.login(LoginMB.java:40)
    ….

    Teria alguma ideia do porque isto esta aconteendo?

    Obrigado desde de já.

    • Alexandre, bom dia.

      Olhe a mensagem de erro que você postou, não está relacionado ao datasource:

      Named query not found: User.findUserByEmail

      Você não criou a namedQuery necessária, ou se criou, está com o nome diferente.

      Obrigado pela visita.

  25. Parabéns pelo blog Hebert… muito bom mesmo.. principalmente esse tópico.. que era exatamente o que eu estava querendo…

    só gostaria de uma ajuda, para incluir LazyDataModel

    no Lazy tenho o metodo load(), correto?
    dentro desse metodo é feito uma busca…que no caso eu ja utilizo Criteria do JPA e queria substituir pelo GenericDAO.

    nao consegui extender porque o LAZY já é extendido e a class ClassDAO tambem extende o GenericDAO.

    No caso, como faço pra usar o Lazy extender o GenericDAO para usar seus metodos?

    Valew.. e obrigado desde já!! Abraços

    • Maicon, boa tarde.

      Não é boa prática misturar as camadas.

      Não aconselho isso e no momento não tenho como planejar algo do tipo para você.

      Desculpe.

      Obrigado pela visita. [=

  26. valew Hebert
    uma duvida… sou iniciante.. aprendi a poucos dias sobre JSF…
    queria saber se esse seu projeto carrega todos os dados do banco de dados de uma vez.. ou ele carrega apenas as paginas e filtro selecionados?

    obrigado..

  27. Ola Hebert seu exemplo não tem preço, como ficaria o mesmo exemplo utilzando one-to-many, essa é minha grande dificuldade.
    Abraço.

      • Obrigado pela resposta Hebert, acho que eu não soube expressar a minha dúvida, que é aseguinte, é na parte do facade como no seu exemplo:

        public void addDogToPerson(int dogId, int personId) {
        personDAO.beginTransaction();
        dogDAO.joinTransaction();
        Dog dog = dogDAO.find(dogId);
        Person person = personDAO.find(personId);
        person.getDogs().add(dog);
        dog.getPerson().add(person);
        personDAO.commitAndCloseTransaction();
        }

        como faria esse metodo one to many?

  28. Hebert,

    o unico motivo que te levou a criar os dialogs em arquivos separados foi para deixar os codigos mais organizados?

    Abraço,

  29. Olá Hebert,

    Está acontecendo essa situacao na pagina inicial:

    viewId:/pages/public/login.xhtml – A exibição de /pages/public/login.xhtml não pôde ser restaurada.

    É normal? Voce sabe como tratar para nao acontecer para a pagina inicial?

    Obrigado,

    • Marcel, boa tarde.

      Esse erro acontece quando a sessão morre ou o servidor é reiniciado, com isso a árvore de componentes que estavam no servidor não podem ser restauradas.

      Se você procurar na net você vai ver que a solução existente é capturar o erro e redirecionar o usuário para uma página específica.

      Obrigado pela visita.

  30. Blz Hebert,

    Vou procurar.

    tentei adicionar o seguinte codigo no metodo init: allowedURIs.add(“/recomendacao/pages/public/login.xhtml”);

    mas nao adiantou.

    ——————–

    Eu quis dizer o metodo init da classe LoginCheckFilter.java

    ——————–

    Adicionei a seguinte linha no web.xml:

    javax.faces.application.ViewExpiredException
    /JSFCrud/pages/public/login.xhtml

  31. Kra antes de tudo parabens. Mas tenho uma duvida caso ocorra alguma exceção como trata-la? Seria possivel implementar o inicio da transacao e commit com phaselistener? E sera possivel ainda usando phaselistener, quando houvesse um erro do tipo 500 desse um rollback automatico?

    • Henrick, boa tarde.

      Infelizmente não sei te falar, ainda não trabalhei ou estudei a abordagem do PhaseListener.

      Obrigado pela visita.

    • hilner, boa tarde.

      O nome do database no datasource está correto?

      Vc chegou apertar o botão para logar conforme indicado no post?

      Obrigado pela visita.

  32. Olá primeiro parabéns pelo post.
    Mas o problema é que não consegui rodar a aplicação, estou tentando rodar no MySQL, adicionei o driver do MySQL e mudei as configurações do persistence.xml para que fique adequado ao MySQL.

    Já criei o banco com “Create Database JSFCrudDB”, e quando acesso “http://localhost:8080/JSFCrudApp/” e preencho apenas o username ele da a mensagem “Password: is empty. Please, provide some value”, porém quando coloco o password ele da erro “An Error Occurred:” java.lang.ExceptionInInitializerError e um enorme StackTrace.

    *Detalhe as tabelas não estão sendo criadas.

    ——————————————-

    Consegui resolver o problema. E novamente lhe parabenizo espero ansiosamente por mais posts.

    • Douglas, boa noite.

      Que bom que você conseguiu, fico feliz por ajudar. [=

      Atém mais.

      OBS.: Eu editei seu post agrupando suas duas últimas mensagens. [=

  33. Não seria mais interessante (correto) deixar o controle de transactions dentro do próprio DAO? dessa forma que está não estaria misturando um pouco as duas camadas (persistência e negócio)?

    • Olá Ricardo, boa noite.

      Depende da sua necessidade. Imagine a situação onde para a mesma tarefa serão utilizados 3 DAOs diferentes, o ideal seria um Facade para controlar as transações dos 3; por exemplo DAO1 DAO2 DAO3. Se cada dao tivesse sua própria transação você teria que abrir e fechar 3 vezes a transação, e o que seria pior, caso o DAO3 desse uma exception não teria como dar rollback nas ações do DAO1 e DAO2.

      Não digo que você está errado, apenas digo que isso varia para cada situação. Quando se trata de pattern é muito complicado exister uma regra absoluta. [=

      Obrigado pela visita.

      • Muito obrigado pela explicação, realmente faz muito sentido pra mim agora. Esses patterns as vezes deixam a gente louco. Uma dúvida que sempre fico sobre o DAO é se considero ele um classe/objeto da camada de acesso a dados ou negócio. No caso dele ser da camada de négocio, considero que o JPA implementaria toda a camada de acesso a dados?

        • Ricardo bom dia,

          O DAO serve apenas para acessar DB e conter “lógica” relacionadas a Query. Seu próprio nome já determina isso, Data Access Object.

          Obrigado pela visita

  34. se puder ver e puder me ajudar
    estou desenvolvendo um sistema comercial em q preciso implementar cupom fiscal
    sera que poderia me ajudar como faço para comsumir as dll da impressora que =e escirita em c/c++

    • Antonio, bom dia.

      Infelizmente não tenho nenhum tutorial sobre como acessar DLL com java.

      Você encontrará muito material no google, pois esse assunto é muito velho. [=

      Obrigado pela visita.

    • Ricardo, boa noite.

      Se utilizarmos o EntityManagedFactory para sempre buscar um EntityManager não teríamos esse problema. Ele é ThreadSafe.

      Obrigad pela visita. [=

      • Entendo… o problema é que o EntityManager (que não é thread-safe) sendo um atributo da classe, esse não seria compartilhado em outras threads? se usarmos EJB ou Spring, eles resolvem esse problema, caso contrário, creio que você tenhamos que usar algum controle próprio como a classe ThreadLocal. Como a documentação do hibernate recomenda: “In other words, JTA transactions and persistence context propagation are not supported in Java SE (you will have to propagate the persistence context yourself, e.g. using the thread local session pattern popular in the Hibernate community).” (http://docs.jboss.org/hibernate/core/4.0/hem/en-US/html/architecture.html#architecture-javase)

        • Ricardo, boa tarde.

          Concordo com você 100%.

          Note que apesar de ter o EntityManager como atributo, a cada chamada para iniciar a transação o EntityManagerFactory é utilizado para buscar uma instância nova.

          Esse modo você está mantendo um EntityManager por transação.

          Pela especificação o EntityManager realmente não é ThreadSafe mas o EntityManagerFactory é.

          Espero ter esclarecido o porque da minha abordagem. [=

          • Entendi sua abordagem mas ao meu ver a solução ainda não está thread-safe. O objeto de dao é um atributo do seu facade, logo ele será compartilhado entre todas as thread que utilizarem ele. Creio que o fato de você criar o EntityManager dentro do beginTransaction() não irá proteger o mesmo. Imagine duas thread concorrendo nesse caso. A thread-1 executa beginTransaction() e salva um objeto, antes de dar o commit a thread-2 chama o método beginTransaction(), gerando um novo EntityManager, quando a thread-1 for dar o commit() o EntityManager nem será o mesmo. Pra mim o problema está justamente nesse ponto…. em testes com apenas 1 usuário vai funcionar 100%. Se colocarmos 20 usuários concorrendo, creio que vai dar problema. Talvez seria interessante fazer um teste de stress.

          • Ricardo, boa tarde.

            Vou fazer o teste depois.

            Eu imagino que não venha a ter problema pois o DAO é criado por thread. Note que onde ele precisa ser utilizar é sempre feito um new DAO, dentro de um Facade que é feito new no ManagedBean.

            Ele não é reutilizado ou reaproveitado, até onde eu sei isso não daria problema. Cada ManagedBean está atrelado a um usuário apenas. Para cada Thread uma instância está sendo criada.

            Ainda assim irei validar.

            Obrigado pela dica.

          • Mas o ManagedBean está anotado com @ViewScoped, cada view teria sua instância do managedbean, que teria sua instância do Facade.. e aí por diante.

            Não vejo problema na abordagem do Hébert

  35. Boa noite Hebert, cara desculpa ficar postando … mas sou completamente novo em JPA … criei um web dynamic project … importei as bibliotecas … indiquei q o projeto utiliza jpa e jsf … agora no model criei a classe login … mas da o seguinte erro “Class “com.model.Login” is mapped, but is not included in any persistence unit” sabe me dizer o que pode ser?
    Obrigado.

    []s

    • Olá Denis, bom dia.

      Desculpe mas não entendi por que ter uma classe login no seu modelo. Caso realmente seja necessário, verifique se a classe Login está anotada corretamente.
      Você pode postar seus códigos no GUJ que o pessoal lá irá ajudar, se vacilar até eu mesmo. [=

      Obrigado pela visita.

  36. Parabéns pelo Material!

    Estou tento um probleminha, fiz o download do seu projeto, porém quando executo ele não cria as tabelas no banco. Já cliquei no botão login, porém nada acontece e na tela de console não me aparece nada, nenhuma mensagem. O que poderia ser?

    Por favor me ajude.

    • Bruno, bom dia.

      Verifique se o caminho do banco de dados está correto juntamente o usuário e a senha.

      É a única coisa que consigo pensar agora, uma vez que não há mensagem de erro.

      Obrigado pela visita.

  37. Opa Hebert blz cara,
    Seguinte estou quebrando a cabeça aqui com uma nova entidade que eu criei utilizando o seu exemplo. Olha só o erro que retorna:

    Caused by: java.lang.IllegalArgumentException: Unknown entity: br.com.mrxfocus.newpayperview.model.Publisher
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:675)
    at br.com.mrxfocus.newpayperview.dao.GenericDAO.save(GenericDAO.java:61)

    AJUDA!!!

    • Olá Rafael, tudo bem?

      Esse erro diz que a classe não está mapeada.

      Você utilizou o @Entity do mesmo pacote indicado no post?

      Obrigado pela visita.

      Me perdoe a demora em responder, realmente estou muito ocupado nesses dias. =/

  38. Não estou conseguindo rodar o projeto sabe o que pode ser, esse erro java.lang.VerifyError: class org.apache.catalina.loader.DevLoader overrides final method start.()V

    eu importando o projeto da esse erro e eu criando manualmente também ocorre mesmo erro.

    • Eduardo, boa tarde.

      Nunca vi esse erro.

      Tente utilizar u Tomcat novo, pode ser que o seu atual corrompeu alguma coisa.

      Obrigado pela visita.

  39. Fala, Hebert!

    Você pode por favor disponibilizar as tabelas da base de dados?
    Não sei porque o não está funcionando.

    Estou recebendo java.lang.NoClassDefFoundError: Could not initialize class com.dao.UserDAO

    alguma ideia?

    Abraços

    —————————————————-

    Estranhamente funciona com posgres.
    Vou dar mais uma estudada!
    Obrigadasso pelos seus posts!

    • Vitor, bom dia.

      Estranho funcionar em um banco de dados e em outro não.

      Pelo menos funcionou! =D

      Obrigado pela visita, fiquei feliz por ter ajudado. [=

  40. Ta grande a galera aqui. Decidi vir no Scroll do mouse mas quase dei um ctrl+end. hehe..
    Hebert, mais uma vez parabéns.
    Excelente Post!!!

    • Leandro, boa noite.

      Pensei bem no que você falou e até resolvi paginar os comentários.

      Obrigado pela visita e pelo apoio. [=

  41. Bom dia Hebert,

    Primeiramente, queria pedir desculpas por eu ter sumido.

    Gostaria de tirar a seguinte duvida sobre essa aplicacao que voce criou: como eu poderia testar no soapui ou chamar no browser um webservice que eu criar dentro dessa aplicacao? percebi que o login está impedindo.

    Percebi que mesmo se eu colocar a linha abaixo no arquivo LoginCheckFilter

    allowedURIs.add()

    nao resolve para eu chamar o webservice no soapui, pois o soapui devolve o formato da tela de login. Colocando a linha acima no arquivo citado aceitou eu chamar o webservice no browser apenas após eu ter apertado F5 duas vezes.

    Voce sabe como eu poderia resolver esse problema da chamada do webservice no soapui?

    Grande Abraço,

    ———————————————-

    Eu quis dizer a linha “allowedURIs.add( url do webservice sem “?wsdl” ) “

    • Marcel, bom dia.

      Para testar a aplicação, você teria que fazer uma sequencia de chamadas ou chamar diretamente a tela de login.

      Após a primeira chamada, ele te redirecionaria para a tela de login e aí você submeteria o login/senha.

      O allowedURIs é para permitir que chamadas sejam feitas à aplicação sem a necessidade de validação.

      Obrigado pela visita.

      • Olá Hebert,

        É que eu quero chamar um webservice que fica dentro dessa aplicacao a partir de um celular. Nao entendi muito bem o que voce disse. O teste que eu fiz aqui depois do que voce disse foi logar no sistema e fazer a chamada para o webservice atraves de

        http://localhost:8080/recomendacao/WSTeste?wsdl

        Estou utilizando soap. Voce poderia explicar melhor, por favor?

        O meu problema é que estou em outra aplicacao.

        Abraço,

        • Marcel, bom dia.

          Em geral um Webservice é criado em um projeto a parte, ou então em alguma parte do sistema não validado por filter/jaas/etc.

          Você poderia alterar no seu web.xml para a sua segurança validar toda a chegada através da URL que termine em site: meusite/site….. aí sim seria validado.

          As chamadas webservices seriam feitas através da URL com outro final, tipo webservices: meusite/webservices….

          Desse modo a validação do site não impediria uma chamada do webservices.

          Espero ter ajudado.

          Até mais.

          • Hebert,

            Adotei a segunda opcao e funcionou blz.

            Desculpe atrapalhar voce.

            Eu gostaria de poder retribuir de alguma forma num momento oportuno. Atualmente tenho estado ocupado com varios trabalhos.

          • Marcel, bom dia.

            Não é atrapalhar não, relaxe.

            Eu apenas passei o caminho das pedras, quem fez tudo foi você. [=

            Parabéns por conseguir, e qualquer coisa é só falar. [=

  42. Olá, Hebert! Estou a dias já procurando algum tutorial bom e eis que encontro o seu! Show mesmo, bem explicado. Ainda tenho muitas dúvidas, e pesquisei por aqui e não vi ninguem reclamando deste problema:

    java.lang.IllegalArgumentException: Unknown name value for enum class com.model.Role: ADMIN

    O que poderia ser?

    Parabéns pelo blog e pelo exemplo.

    Valeu

    • Rafael, boa noite.

      Desculpe a demora em responder.

      Verifique se no banco de dados o nome do papel está exatamente igual ao nome do administrador no ENUM.

      Obrigado pela visita.

  43. Olá Hebert.
    Parabéns pelo post.
    Consegui configurar a aplicação usando MySQL, mas não está criando o schema e as tables.
    ERROR JDBCExceptionReporter:234 – Table ‘jsfcruddb.users’ doesn’t exist
    Vc faz ideia do q pode ser?

    • Rodrigo, boa tarde.

      Veja se a tabela realmente foi criada, e se o banco que você está utilizando permite uma tabela com esse nome.

      Obrigado pela visita.

  44. Olá Sr. Hebert

    Achei bem interessante seu post, vc procurou detalhar bem nos seus comentários ( de forma que até eu entendi ), explicando ponto a ponto digamos os pacotes da aplicação.

    Eu já tenho uma aplicação de exemplo que estou montando nas horas vagas com o intuito de dominar o Java, seu post me ajudou a dar uma melhorada no Controller e a principio funcionou mais como meu MB estava com SessionScoped meu objeto ficava com o mesmo valor apos incluir ( vc comenta sobre isto ), então alterei colocando para ViewScoped, tive problemas ( tive que implementar Serializable no DAO e nos Repositorios ) mais feito isto a tela carregou mais, agora não consigo gravar nada no banco e não aparece nenhum erro, nem no log do Tomcat.
    Voltando para ViewScoped consigo gravar mais…. fico com o objeto preso.

    O senhor teria algum comentário a respeito deste comportamento?

    • Robson, boa tarde.

      Infelizmente não tenho como te ajudar.

      Pode ser por diversos motivos que isso está acontecendo.

      Abra um post no GUJ e post lá sua dúvida que o pessoal irá te ajudar, se ñ eu.

      Obrigado pela visita.

  45. Olá Hebert bom dia.

    Então, deixei minha duvida lá no GUJ, mais, hoje o que eu queria era obter um comentário.
    Neste projeto vc usou e frisou isto nas telas a questão do desktop ( primefaces dialogs ), mais … apesar disto as telas ainda tem uma aparência de pagina ( logico estamos falando de web ), ela começa com uma lista, botões em cada linha…
    O que fazer ou como projetar uma tela bem desktop com botões Incluir, Alterar, Excluir, Relatorio, Inicio, Anterior, Proximo, Fim ( aquela barra de botões comum em um programa Java, VFP, Delphi) e porque não vemos isto em exemplos? seria dificil implementar algo assim? em java qdo vejo algo assim é RIA como no OpenSwing ( Swing + Http ) mais não vi uma “pagina” contruida desta forma.

    • Robson, boa tarde.

      Não é o padrão web simular o padrão desktop de interfaces.

      Implementar não seria difícil para quem tem uma boa prática em html/css.

      As ações de banco de dados seriam as mesmas ações de uma aplicação web.

      Espero ter ajudado. [=

  46. Olá Hebert

    Muito boa a sua iniciativa e escrever um artigo tão completo assim. Minha dúvida é: Depois de criar os beans, os daos e o facades, como faço para o Hibernate criar o banco de dados? Estou usando mysql.

    • William, boa tarde.

      Após dar o start da aplicação, acesse-a uma vez.

      O JPA será acionado e as tabelas criadas.

      Obrigado pela visita.

  47. Ola Herbert, é a primeira vez que visito o site e aprovei a iniciativa.

    Eu já tinha iniciado uma aplicação com Primefaces, e os cruds já funcionam perfeitamente. Resolvi iniciar o uso de “autocompletes”, e foi aí que o bicho pegou. Pelo que parece os métodos “complete” do MB, e os “getAsString” e “getAsObject” do “Converter” não estão sendo chamados, pois coloquei uns “Sysouts” neles e não apareceram no console do Netbeans. Tem alguma dica?

    • Franklin,

      Teria que analisar código para tentar entender por que.

      Poste suas dúvidas no GUJ para o pessoal ajudar lá.

      Código aqui não fica bom. [=

      Até mais! o_

  48. Olha Hebert,

    estou com um problema ao executar este exemplo…

    Dado este persistence.xml

    org.hibernate.ejb.HibernatePersistence

    Porque minhas tabelas não são criadas ao iniciar o sistema?

    • Você precisaria estudar o modelo e entender como funciona o ManyToOne. Aqui no blog tem um post que explica isso.

      Até mais.

    • Augusto, boa noite.

      Esse post que você comentou mostra isso.

      Na última página você encontra o código para download.

      Até mais.

  49. Olá Hebert, Excelente post!!!
    Eu segui todos os passos mas obtive o seguinte erro após passar pela tela de login

    javax.faces.el.EvaluationException: java.lang.NoClassDefFoundError: Could not initialize class com.dao.UserDAO
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.filter.LoginCheckFilter.doFilter(LoginCheckFilter.java:68)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
    Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.dao.UserDAO
    at com.facade.UserFacade.(UserFacade.java:7)
    at com.mb.LoginMB.login(LoginMB.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
    … 27 more

    Tem idéia di que possa ser?

    Desde já muito obrigado pela atenção

    ———————————–

    Consegui resolver. O Problema era no persistence.xml, tinha colocado o nome da base errado. Quem quiser dar uma conferida a aplicação está disponível em:
    http://54.232.193.142/JSFCrudApp
    Vlw

  50. Hebert, no caso, seu eu nao quiser definir um Converter para cada class, de puder fazer um converter Generico, e definir no AutoComplete, neh?

    Mas no meu ex, esta acontecendo o seguinte

    GRAVE: java.lang.ClassCastException: MeuEntity cannot be cast to java.lang.String

    Tem ideia do que acontece?

    • Felipe, boa noite.

      Parece que o retorno do seu converter está errado (o que recebe String e return um Object). [=

      Infelizemente não tenho como analizar códigos agora, coloque no GUJ que se eu não ajudar, alguém o fará.

      Até mais. o_

      • ola uaihebert so nao entendi a parte de permissao de usuario, qdo eu faço login com o role ‘USER’ ele esconde o botão DOG.
        Pode me explicar melhor?

        • Gustavo, boa tarde.

          É justamente por que o usuário não tem permissão para isso.

          Essa é a idéia do segurança do JAAS. Com ele conseguimos filtrar o que cada usuário pode ver.

          Obrigado pela visita.

  51. Ola amigo,
    seu post é muito bom, pena que quando fui tentar configurar com o mysql não funcionou ( sou iniciante com eclipse, uso NETBEANS )
    Eu estava interessado em comprar o livro, mas como isto não funcionou, temo também não conseguir fazer funcionar outros.
    Bom não sei como substituir a chamada ao mysql no projeto, tentei criar a base direto no mysql, mas também não deu certo.
    Gostaria muito que ele funcionasse, que pena que não deu certo :(

    • Olá Paulo, boa tarde.

      Abra um post no GUJ e post lá o seu erro.

      Caso eu ñ possa te ajudar, outras pessoas o ajudarão.

      Aqui não é bom para analisar erro ou código.

      Desculpe não poder ajudar com uma resposta mais certa.

      Att,

  52. Para utilizar MySQL no lugar desse Postgree é possível? Basta apenas substituir ou sua aplicação não roda com MySQL?

  53. Hebert li seu tutorial baixei o fonte e importei o mesmo no eclipse mas acontece o seguinte bug:

    Jun 28, 2013 11:41:10 AM org.apache.catalina.core.AprLifecycleListener init
    INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:Program FilesJavajre7bin;C:WindowsSunJavabin;C:Windowssystem32;C:Windows;C:Program FilesCommon FilesMicrosoft SharedWindows Live;C:Program Files (x86)Common FilesMicrosoft SharedWindows Live;C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:Program Files (x86)ATI TechnologiesATI.ACECore-Static;C:Program FilesBroadcomBroadcom 802.11Driver;C:Program FilesWIDCOMMBluetooth Software;C:Program FilesWIDCOMMBluetooth Softwaresyswow64;C:Program Files (x86)Windows LiveShared;C:Program Files (x86)Common FilesAdobeAGL;C:Program Files (x86)Javajdk1.6.0_16bin;C:Program Files (x86)QuickTimeQTSystem;.
    Jun 28, 2013 11:41:10 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
    WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ‘source’ to ‘org.eclipse.jst.jee.server:JSFCrudApp’ did not find a matching property.
    Jun 28, 2013 11:41:11 AM org.apache.coyote.AbstractProtocol init
    INFO: Initializing ProtocolHandler [“http-bio-8080″]
    Jun 28, 2013 11:41:11 AM org.apache.coyote.AbstractProtocol init
    INFO: Initializing ProtocolHandler [“ajp-bio-8009″]
    Jun 28, 2013 11:41:11 AM org.apache.catalina.startup.Catalina load
    INFO: Initialization processed in 1809 ms
    Jun 28, 2013 11:41:11 AM org.apache.catalina.core.StandardService startInternal
    INFO: Starting service Catalina
    Jun 28, 2013 11:41:11 AM org.apache.catalina.core.StandardEngine startInternal
    INFO: Starting Servlet Engine: Apache Tomcat/7.0.41
    Jun 28, 2013 11:41:15 AM com.sun.faces.config.ConfigureListener contextInitialized
    INFO: Inicializando Mojarra 2.2.0 ( 20130502-2118 https://svn.java.net/svn/mojarra~svn/tags/2.2.0@11930) para o contexto ”
    Jun 28, 2013 11:41:16 AM com.sun.faces.spi.InjectionProviderFactory createInstance
    INFO: JSF1048: Anotações PostConstruct/PreDestroy presentes. Os métodos ManagedBeans marcados com essas anotações informarão as anotações processadas.
    Jun 28, 2013 11:41:17 AM com.sun.faces.config.ConfigureListener contextInitialized
    SEVERE: Critical error during deployment:
    com.sun.faces.config.ConfigurationException:
    Source Document: jar:file:/C:/Farol%20Sistemas/AMBIENTE/apache-tomcat-7.0.41/lib/primefaces-3.5.jar!/META-INF/faces-config.xml
    Cause: Class ‘org.primefaces.component.fileupload.FileUploadRenderer’ is missing a runtime dependency: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItem
    at com.sun.faces.config.processor.AbstractConfigProcessor.createInstance(AbstractConfigProcessor.java:339)
    at com.sun.faces.config.processor.RenderKitConfigProcessor.addRenderers(RenderKitConfigProcessor.java:313)
    at com.sun.faces.config.processor.RenderKitConfigProcessor.process(RenderKitConfigProcessor.java:179)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.ManagedBeanConfigProcessor.process(ManagedBeanConfigProcessor.java:270)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.ValidatorConfigProcessor.process(ValidatorConfigProcessor.java:120)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.ConverterConfigProcessor.process(ConverterConfigProcessor.java:126)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.ComponentConfigProcessor.process(ComponentConfigProcessor.java:117)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.ApplicationConfigProcessor.process(ApplicationConfigProcessor.java:340)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.LifecycleConfigProcessor.process(LifecycleConfigProcessor.java:116)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:239)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:435)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:214)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4887)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5381)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItem
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
    at java.lang.Class.getDeclaredMethods(Unknown Source)
    at com.sun.faces.util.Util.classHasAnnotations(Util.java:969)
    at com.sun.faces.application.ApplicationInstanceFactoryMetadataMap.onPut(ApplicationInstanceFactoryMetadataMap.java:75)
    at com.sun.faces.application.ApplicationInstanceFactoryMetadataMap.onPut(ApplicationInstanceFactoryMetadataMap.java:43)
    at com.sun.faces.util.MetadataWrapperMap.put(MetadataWrapperMap.java:91)
    at com.sun.faces.config.processor.AbstractConfigProcessor.loadClass(AbstractConfigProcessor.java:378)
    at com.sun.faces.config.processor.AbstractConfigProcessor.createInstance(AbstractConfigProcessor.java:278)
    … 28 more
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItem
    at java.net.URLClassLoader$1.run(Unknown Source)
    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)
    … 37 more

    Jun 28, 2013 11:41:17 AM org.apache.catalina.core.StandardContext listenerStart
    SEVERE: Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener
    java.lang.RuntimeException: com.sun.faces.config.ConfigurationException:
    Source Document: jar:file:/C:/Farol%20Sistemas/AMBIENTE/apache-tomcat-7.0.41/lib/primefaces-3.5.jar!/META-INF/faces-config.xml
    Cause: Class ‘org.primefaces.component.fileupload.FileUploadRenderer’ is missing a runtime dependency: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItem
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:273)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4887)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5381)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: com.sun.faces.config.ConfigurationException:
    Source Document: jar:file:/C:/Farol%20Sistemas/AMBIENTE/apache-tomcat-7.0.41/lib/primefaces-3.5.jar!/META-INF/faces-config.xml
    Cause: Class ‘org.primefaces.component.fileupload.FileUploadRenderer’ is missing a runtime dependency: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItem
    at com.sun.faces.config.processor.AbstractConfigProcessor.createInstance(AbstractConfigProcessor.java:339)
    at com.sun.faces.config.processor.RenderKitConfigProcessor.addRenderers(RenderKitConfigProcessor.java:313)
    at com.sun.faces.config.processor.RenderKitConfigProcessor.process(RenderKitConfigProcessor.java:179)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.ManagedBeanConfigProcessor.process(ManagedBeanConfigProcessor.java:270)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.ValidatorConfigProcessor.process(ValidatorConfigProcessor.java:120)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.ConverterConfigProcessor.process(ConverterConfigProcessor.java:126)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.ComponentConfigProcessor.process(ComponentConfigProcessor.java:117)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.ApplicationConfigProcessor.process(ApplicationConfigProcessor.java:340)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.LifecycleConfigProcessor.process(LifecycleConfigProcessor.java:116)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:152)
    at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:239)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:435)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:214)
    … 10 more
    Caused by: java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItem
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
    at java.lang.Class.getDeclaredMethods(Unknown Source)
    at com.sun.faces.util.Util.classHasAnnotations(Util.java:969)
    at com.sun.faces.application.ApplicationInstanceFactoryMetadataMap.onPut(ApplicationInstanceFactoryMetadataMap.java:75)
    at com.sun.faces.application.ApplicationInstanceFactoryMetadataMap.onPut(ApplicationInstanceFactoryMetadataMap.java:43)
    at com.sun.faces.util.MetadataWrapperMap.put(MetadataWrapperMap.java:91)
    at com.sun.faces.config.processor.AbstractConfigProcessor.loadClass(AbstractConfigProcessor.java:378)
    at com.sun.faces.config.processor.AbstractConfigProcessor.createInstance(AbstractConfigProcessor.java:278)
    … 28 more
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItem
    at java.net.URLClassLoader$1.run(Unknown Source)
    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)
    … 37 more

    Jun 28, 2013 11:41:17 AM org.apache.catalina.core.StandardContext startInternal
    SEVERE: Error listenerStart
    Jun 28, 2013 11:41:17 AM org.apache.catalina.core.StandardContext startInternal
    SEVERE: Context [] startup failed due to previous errors
    Jun 28, 2013 11:41:17 AM javax.faces.FactoryFinder$FactoryManager copyInjectionProviderFromFacesContext
    SEVERE: Unable to obtain InjectionProvider from init time FacesContext. Does this container implement the Mojarra Injection SPI?
    Jun 28, 2013 11:41:17 AM javax.faces.FactoryFinder$FactoryManager getFactory
    SEVERE: O aplicativo não foi iniciado corretamente na inicialização. Não foi possível encontrar Fábrica: javax.faces.application.ApplicationFactory. Attempting to find backup.
    Jun 28, 2013 11:41:17 AM com.sun.faces.config.ConfigureListener contextDestroyed
    SEVERE: Unexpected exception when attempting to tear down the Mojarra runtime
    java.lang.IllegalStateException: Could not find backup for factory javax.faces.application.ApplicationFactory.
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:1135)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:379)
    at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:140)
    at com.sun.faces.config.ConfigureListener.contextDestroyed(ConfigureListener.java:310)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4927)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5573)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

    Jun 28, 2013 11:41:17 AM javax.faces.FactoryFinder releaseFactories
    SEVERE: Unable to call @PreDestroy annotated methods because no InjectionProvider can be found. Does this container implement the Mojarra Injection SPI?
    Jun 28, 2013 11:41:21 AM org.apache.catalina.startup.TaglibUriRule body
    INFO: TLD skipped. URI:
    http://java.sun.com/jsf/html
    is already defined
    Jun 28, 2013 11:41:21 AM org.apache.catalina.startup.TaglibUriRule body
    INFO: TLD skipped. URI: http://java.sun.com/jsf/core is already defined
    Jun 28, 2013 11:41:21 AM org.apache.catalina.startup.TaglibUriRule body
    INFO: TLD skipped. URI: http://mojarra.dev.java.net/mojarra_ext is already defined
    Jun 28, 2013 11:41:21 AM com.sun.faces.config.ConfigureListener contextInitialized
    INFO: Inicializando Mojarra 2.2.0 ( 20130502-2118 https://svn.java.net/svn/mojarra~svn/tags/2.2.0@11930) para o contexto ‘/JSFCrudApp’
    Jun 28, 2013 11:41:25 AM com.sun.faces.config.ConfigManager initialize
    INFO: Unsanitized stacktrace from failed start…
    java.lang.ClassCastException: org.primefaces.lifecycle.RestoreViewPhaseListener cannot be cast to javax.faces.event.PhaseListener
    at com.sun.faces.config.processor.LifecycleConfigProcessor.addPhaseListeners(LifecycleConfigProcessor.java:148)
    at com.sun.faces.config.processor.LifecycleConfigProcessor.process(LifecycleConfigProcessor.java:111)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:114)
    at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:216)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:338)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:226)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4887)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5381)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

    Jun 28, 2013 11:41:25 AM com.sun.faces.config.ConfigureListener contextInitialized
    SEVERE: Critical error during deployment:
    com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.primefaces.lifecycle.RestoreViewPhaseListener cannot be cast to javax.faces.event.PhaseListener
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:357)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:226)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4887)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5381)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: java.lang.ClassCastException: org.primefaces.lifecycle.RestoreViewPhaseListener cannot be cast to javax.faces.event.PhaseListener
    at com.sun.faces.config.processor.LifecycleConfigProcessor.addPhaseListeners(LifecycleConfigProcessor.java:148)
    at com.sun.faces.config.processor.LifecycleConfigProcessor.process(LifecycleConfigProcessor.java:111)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:114)
    at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:216)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:338)
    … 11 more

    Jun 28, 2013 11:41:25 AM org.apache.catalina.core.StandardContext listenerStart
    SEVERE: Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener
    java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.primefaces.lifecycle.RestoreViewPhaseListener cannot be cast to javax.faces.event.PhaseListener
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:294)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4887)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5381)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Caused by: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.primefaces.lifecycle.RestoreViewPhaseListener cannot be cast to javax.faces.event.PhaseListener
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:357)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:226)
    … 10 more
    Caused by: java.lang.ClassCastException: org.primefaces.lifecycle.RestoreViewPhaseListener cannot be cast to javax.faces.event.PhaseListener
    at com.sun.faces.config.processor.LifecycleConfigProcessor.addPhaseListeners(LifecycleConfigProcessor.java:148)
    at com.sun.faces.config.processor.LifecycleConfigProcessor.process(LifecycleConfigProcessor.java:111)
    at com.sun.faces.config.processor.AbstractConfigProcessor.invokeNext(AbstractConfigProcessor.java:114)
    at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:216)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:338)
    … 11 more

    Jun 28, 2013 11:41:25 AM org.apache.catalina.core.StandardContext startInternal
    SEVERE: Error listenerStart
    Jun 28, 2013 11:41:25 AM org.apache.catalina.core.StandardContext startInternal
    SEVERE: Context [/JSFCrudApp] startup failed due to previous errors
    Jun 28, 2013 11:41:25 AM com.sun.faces.config.ConfigureListener contextDestroyed
    SEVERE: Unexpected exception when attempting to tear down the Mojarra runtime
    java.lang.IllegalStateException: O aplicativo não foi iniciado corretamente na inicialização. Não foi possível encontrar Fábrica: javax.faces.application.ApplicationFactory. Attempting to find backup.
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:804)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:306)
    at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:108)
    at com.sun.faces.config.ConfigureListener.contextDestroyed(ConfigureListener.java:327)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4927)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5573)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

    Jun 28, 2013 11:41:25 AM org.apache.catalina.loader.WebappClassLoader checkThreadLocalMapForLeaks
    SEVERE: The web application [/JSFCrudApp] created a ThreadLocal with key of type [com.sun.faces.util.Util$1] (value [com.sun.faces.util.Util$1@27da6356]) and a value of type (value [{com.sun.faces.patternCache={ = }}]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
    Jun 28, 2013 11:41:25 AM org.apache.coyote.AbstractProtocol start
    INFO: Starting ProtocolHandler [“http-bio-8080″]
    Jun 28, 2013 11:41:25 AM org.apache.coyote.AbstractProtocol start
    INFO: Starting ProtocolHandler [“ajp-bio-8009″]
    Jun 28, 2013 11:41:25 AM org.apache.catalina.startup.Catalina start
    INFO: Server startup in 14203 ms

    Se puder ajudar agradeço!

    • Olá, boa tarde.

      Veja se não existe alguma outra aplicação dentro do seu servidor.

      Está aparecendo mensagem de erro que está faltando biblioteca relacionada a upload.

      Eu testei aqui em um servidor zerado e não tive problema.

      Att,

  54. Olá Hebert, muito bom seu blog, parabéns. Preciso de uma dica, baixei esta aplicação e importei para o eclipse e não roda o hibernate, simplesmente não carrega nenhum log. A aplicação até inicia, mas sem não chega a criar as tabelas no banco que eu criei com o nome que indicou. Tentei atualizar as bibliotecas do hibernate, mas não funcionou. Tem alguma ideia do que pode ser? Segue o trace do toncat.

    Jul 22, 2013 1:51:48 PM org.apache.catalina.core.AprLifecycleListener init
    INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:Program FilesJavajre7bin;C:WindowsSunJavabin;C:Windowssystem32;C:Windows;C:Program Files (x86)BorlandDelphi7Bin;C:Program Files (x86)BorlandDelphi7ProjectsBpl;C:Program FilesCommon FilesMicrosoft SharedWindows Live;C:Program Files (x86)Common FilesMicrosoft SharedWindows Live;C:orantbin;C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:Program Files (x86)Common FilesUlead SystemsMPEG;C:SWTOOLSReadyApps;C:Program Files (x86)IntelServicesIPT;C:Program Files (x86)SymantecVIP Access Client;C:Program Files (x86)Windows LiveShared;C:Program FilesJavajdk1.7.0_07bin;
    Jul 22, 2013 1:51:48 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
    WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ‘source’ to ‘org.eclipse.jst.jee.server:JSFCrudApp’ did not find a matching property.
    Jul 22, 2013 1:51:49 PM org.apache.coyote.AbstractProtocol init
    INFO: Initializing ProtocolHandler [“http-bio-8080″]
    Jul 22, 2013 1:51:49 PM org.apache.coyote.AbstractProtocol init
    INFO: Initializing ProtocolHandler [“ajp-bio-8009″]
    Jul 22, 2013 1:51:49 PM org.apache.catalina.startup.Catalina load
    INFO: Initialization processed in 545 ms
    Jul 22, 2013 1:51:49 PM org.apache.catalina.core.StandardService startInternal
    INFO: Starting service Catalina
    Jul 22, 2013 1:51:49 PM org.apache.catalina.core.StandardEngine startInternal
    INFO: Starting Servlet Engine: Apache Tomcat/7.0.30
    Jul 22, 2013 1:51:51 PM com.sun.faces.config.ConfigureListener contextInitialized
    INFO: Inicializando Mojarra 2.0.4 (FCS b09) para o contexto ‘/JSFCrudApp’
    Jul 22, 2013 1:51:52 PM com.sun.faces.spi.InjectionProviderFactory createInstance
    INFO: JSF1048: Anotações PostConstruct/PreDestroy presentes. Os métodos ManagedBeans marcados com essas anotações informarão as anotações processadas.
    Jul 22, 2013 1:51:52 PM org.primefaces.webapp.PostConstructApplicationEventListener processEvent
    INFO: Running on PrimeFaces 3.3.1
    Jul 22, 2013 1:51:52 PM com.sun.faces.config.ConfigureListener$WebConfigResourceMonitor$Monitor
    INFO: Monitoring jndi:/localhost/JSFCrudApp/WEB-INF/faces-config.xml for modifications
    Jul 22, 2013 1:51:52 PM org.apache.coyote.AbstractProtocol start
    INFO: Starting ProtocolHandler [“http-bio-8080″]
    Jul 22, 2013 1:51:52 PM org.apache.coyote.AbstractProtocol start
    INFO: Starting ProtocolHandler [“ajp-bio-8009″]
    Jul 22, 2013 1:51:52 PM org.apache.catalina.startup.Catalina start
    INFO: Server startup in 3492 ms

    • Anderson, boa tarde.

      Conforme dito no post, é necessário apertar o botão de login uma vez para que o hibernate seja chamado e comece a criar as tabelas.

      Obrigado pela visita.

  55. Bom dia, muito bom o post, se não for pedir de mais, você poderia dar um exemplo simples de relacionamento, pois não consigo pegar a chave estrangeira de outra tabela. Será que precisa fazer DAO genérico, ou com cada dao de sua tabela correspondente você consegue a chave estrangeira. Tô usando JSF.
    E não fui no GUJ por que tem uns caras que acham que sabem de mais e já fui destratado por um deles, por isso que não postei minhas dúvidas lá. A última que li lá no GUJ foi que “é mais fácil engolir do que mastigar”. Com uma dessa agente fica até com receio de perguntar.

  56. Olá Herbert, há um problema que não estou entendendo o motivo.
    Eu troquei o postgre pelo mysql, até aí tudo bem. Está funcionando e etc.
    Mas quando baixo o servidor, e retomo a aplicação, ele cria novamente todas as
    tabelas, matando o que foi feito no banco.
    Você sabe o que pode ser isso?

    Grato.
    Silvio.

    • Silvio, boa noite.

      Realmente estranho esse comportamento por parte da aplicação.

      Se você reparar no persistence.xml tem a configuração:

      Essa configuração indica ao JPA para que seja criada a tabela apenas caso ela não exista.

      Veja se não questão de permissão de usuário ou qualquer outra coisa do tipo, pois nunca vi esse problema se não relacionado a essa configuração.

      Obrigado pela visita.

  57. Olá camarada… Resolvido! Obrigado pela atenção, e empenho em compartilhar toda essas informações.

    Abraços.

    • Olá Silvio, boa noite.

      Fico feliz por ter resolvido. Apenas após responder sua pergunta eu vi que você já havia encontrado a resposta.

      Até mais.

  58. Bom dia,
    Estou utilizando sua classe Filter para fazer alguns testes com timeout de sessão e toda vez que tento acessar uma determinada tela após a sessão ter sido encerrada a aplicação lança a exceção javax.faces.application.ViewExpiredException. Já tentei forçar o redirecionamento da aplicação para a tela de login mas não obtive sucesso. Poderias me indicar uma solução para este problema?

    Obrigado

    • André, boa tarde.

      O filter não influencia em nada esse erro.

      Esse erro acontece quando os dados que estavam na sessão relativos aquela tela não foram encontrados.

      Existem alguns modos de tratar esse problema, procure no google por: handle ViewExpiredException que você encontrará várias soluções.

      Obrigado pela visita.

  59. Olá,

    Primeiramente gostaria de agradecer pelo excelente post. O projeto é muito didático e está rodando sem problemas na minha máquina.
    Porém, me surgiu uma dúvida quando a sua implementação.
    No facade, para utilizar a mesma transação, é utilizado o seguinte comando:
    dogDAO.joinTransaction();
    Porém, no persistence.xml, a definição da persistence unit está:

    O joinTransaction() consegue utilizar a mesma transação mesmo com o parâmetro transaction-type setado para “RESOURCE_LOCAL”, ou é necessário que seja configurado o “JTA”?

    Obrigado
    Abraço

    • Paulo, boa tarde.

      joinTransaction pode ser utilizado com transações sem ser JTA também, tanto que não deu problema aí em sua máquina (ou de qualquer outra pessoa que fez esse tutorial).

      Ele não deu problema justamente pq em algum lugar antes dele foi feito um entityManager.getTransaction().begin();.

      Caso ñ houvesse uma transação ativa, o método joinTransaction lançaria uma exception.

      Obrigado pela visita. [=

      • Obrigado pela resposta!
        Mais uma dúvida:
        Brincando com o projeto reparei que estão ficando muitas conexões abertas no postgre.

        SELECT * FROM pg_stat_activity;

        Consegui resolver esse problema trocando o comando “closeTransaction();” dos finds que se encontram nos facades pelo comando “commitAndCloseTransaction()”. É isso mesmo?
        P.S.: eu troquei o hibernate 3 que está na sua implementação pelo hibernate 4

  60. Hebert,
    Primeiro gostaria de agradecer pelo repasse de conhecimento.
    E te dar os meus parabêns pelo excelente post.
    Baixei os arquivos e rodou perfeitamente, tive um únicio problema com as letras maiúsculas no nome do banco mas resolvi no persistence.xml sem stress.
    Bom aproveitando o feedback uma pergunta, Spring MVC também poderia ser utilizado ?
    Se eu falei bestera desconsidera, com tanta opção agente que está chegando agora fica meio perdido.
    Um abraço

    • Renato, boa tarde.

      O Spring poderia ser utilizado juntamente do JSF sim.

      Infelizmente não tenho nenhum material para te passar sobre o assunto.

      Obrigado pela visita e pelo apoio.

  61. Hebert,
    Primeiro gostaria de agradecer pelo post….

    seguindo seu post não tive nenhum problema na criação do auto complete!!

    porem me surgiu uma duvida, espero que possa me ajudar.

    se meu MB estiver anotado como @ViewScoped é executada a consulta a partir da primeira letra e depois não é efetuado mas nenhuma consulta devido a sua anotação, logo trocando a anotação para @RequestScoped sem problemas.

    minha duvida é, o que posso fazer para continuar utilizando @ViewScoped porem limpar o objeto para que seja possível o funcionamento como @RequestScoped

    • Leonardo, bom dia.

      Nunca tive problema com relação consulta/View Scoped.

      Imagino que que seja algum outro problema que possa estar ocorrendo em seu projeto.

      Poste seu código no GUJ que o pessoal analisar para você lá. [=

      Obrigado pela visita.

  62. Boa tarde, reparei no seu GenericDao que em nenhum momento para fazer as ações no banco você não utiliza nem um dos métodos criados no inicio como o beginTransaction, joinTransaction, commit etc… Não teria problema em criar um entityManager a cada salvar, ou consultar um registro? Seria certo eu fechar o entityManager ao final de cada método? Obrigado e parabéns pelo seu blog.

    • Kleber, boa tarde.

      beginTransaction é utilizado nos facades.

      Ele é o responsável por gerenciar a transação. O ideal é que um EntityManager dure apenas durante a transação.

      Desculpe a demora em responder. Estou muito ocupado nesses últimos dias.

      Att,

  63. Muito obrigado Hebert, mas uma vez um post seu me ajudou!

    Só tenho uma dúvida, se eu por exemplo quisesse criar um método que retornasse a quantidade total de pessoas, eu poderia colocar o “private EntityManager em” como protected e usá-lo no PersonDAO ? haveria algum problema nisso ou seria melhor criar um método que faça isso no GenericDAO ?

    Desculpa se a pergunta é idiota é que como estou estuando ainda pinta essas dúvidas!

    • Thiago, boa tarde.

      Pergunta idiota é pergunta não feita. [=

      Poderia ter um método de count genérico. Geralmente esses métodos são criados com criteria, e o EasyCriteria poderia facilitar e muito sua vida para fazer isso.

      Quanto o EntityManager como protected, isso não seria problema algum.

      Desculpe a demora em responder. Estou muito ocupado nesses últimos dias.

      Att,

  64. Boa noite, primeiramente te parabenizar novamente pelo blog, excelente trabalho!!Cara tenho uma dúvida acho que você pode me ajudar, já entupi os fóruns possíveis da net com essa dúvida(na verdade seria mais uma opinião), suponha que o relacionamento entre Persons e Dog não seja (n x m) e sim (1:n),onde um person pode ter vários dogs, quando eu clicasse em persons with dogs, assim como no tutorial ia me trazer a person e a datatable com os dogs, agora nessa tela eu tenho a opção de incluir um dog para a person ou editar algum dog,ou deletar. pensei em dois cenários:
    1- ir apenas adicioando ou removendo dogs na lista de dogs da person e apenas no save da person eu salvar as alterações feitas na lista e refletir isso no banco.
    2- a cada dog adicionado ,editado ou removido na lista, refletir logo no banco e depois recarregar a person com seus respectivos dogs novamente.
    obs:(assim como no exemplo utilizando tudo na mesma tela e com o mesmo managed bean view)
    como você trabalha com este tipo de relacionamento??
    Outra dúvida ,para o sistema que tou desenvolvendo, o objeto pai não vai ter apenas um detalhe,são muitos, de 15 a 20,vi que no tutorial, na lista de persos tenho o link para ir para os dados da person e outro para ir para persons with dog, mas para meu sistema eu teria que colocar muitos links na datatable,então pensei em um link para os dados do pai, e os outros para os detalhes,cada detalhe eu colocaria em uma arvore, por exemplo
    processo
    |_andamentos
    |_julgamentos
    |_…
    para cada link clicado eu traria o objeto pai com os relacionamentos , andamento(processo com andamentos),julgamento(processo com julgamentos)
    você teria alguma outra ideia, sugestão ou outra forma de trabalhar com objetos com varios detalhes?
    Desculpa as muitas perguntas e a insistência, mas a opinião dos mais experiente é muito válida e tou precisando muito disso pra finalizar esse sistema.
    desde já obrigado.

    • Ricardo boa tarde.

      Relacionamento 1xn (JPA) eu trato como pode ser visto aqui: http://uaihebert.com/?p=1622
      Para ter o valor exibido você poderia criar um botão que listasse todos os cachorros da pessoa em um dialog, ou até mesmo, levar a pessoa para outra página e lá listar os cachorros. Não tenho nenhum código disso aqui agora, mas é basicamente o mesmo tipo de código desse post.

      Sua idéia me parece válida sim, infelizmente não tenho como ajudar muito pois precisaria analisar mais detalhadamente seu modelo e no momento não estou com tempo.

      Obrigado pela visita, até mais.

  65. Bom dia Hebert,

    Estou desenvolvendo um projeto e usando querendo usar partes do seu, nisso queria uma opniao sua.
    Quero usar somente o login de admin e user para o meu projeto, e em vez de utilizar filter usar spring.
    Seu eu tentar usar o seu projeto sem Person e Dog terei problemas?

  66. Olá! Você comentou que não se deve criar regra de negócio dentro de um MB. Neste caso a regra de negócio deve ser criada sempre nas facades?

    • Jonas, boa tarde.

      Não é uma boa prática criar regras de negócio em controllers, mas sim em alguma classe que possa centralizar essas regras.

      O local ideal, em minha opinião, seria em um Facade ou Service.

      Obrigado pela visita.

    • Marcos, boa tarde.

      Para gerar o banco é necessário acessar a tela de login, as tabelas serão geradas.

      Não esqueça de criar o database.

      Caso não consiga acessar a tela de login, algum erro aconteceu na hora do deploy.

  67. Parabens pelo post muito bom , me agregou muito conhecimento…
    estou com um pequeno problema , não consigo cadastrar nada no banco ,
    consigo fazer login , buscar uma pessoa que eu cadastrei manualmente no banco, porém não pode cadastrar nada o que pode ser?

    ele me da isso quando tento cadastrar uma pessoa

    18:16:23,125 DEBUG SessionImpl:265 - opened session at timestamp: 13840281831
    18:16:23,126 DEBUG JDBCTransaction:78 - begin
    18:16:23,126 DEBUG ConnectionManager:444 - opening JDBC connection
    18:16:23,126 DEBUG DriverManagerConnectionProvider:132 - opening new JDBC connection
    18:16:23,144 DEBUG DriverManagerConnectionProvider:138 - created connection to: jdbc:mysql://localhost:3306/jsfcruddb?zeroDateTimeBehavior=convertToNull, Isolation Level: 4
    18:16:23,144 DEBUG JDBCTransaction:83 - current autocommit status: true
    18:16:23,144 DEBUG JDBCTransaction:86 - disabling autocommit
    18:16:23,145 DEBUG CriteriaQueryCompiler:225 - Rendered criteria query -> select generatedAlias0 from com.model.Person as generatedAlias0
    18:16:23,145 DEBUG AbstractBatcher:410 - about to open PreparedStatement (open PreparedStatements: 0, globally: 0)
    18:16:23,145 DEBUG SQL:111 - select person0_.id as id2_, person0_.age as age2_, person0_.name as name2_ from Person person0_
    18:16:23,146 DEBUG AbstractBatcher:426 - about to open ResultSet (open ResultSets: 0, globally: 0)
    18:16:23,146 TRACE BasicExtractor:70 - found [1] as column [id2_]
    18:16:23,147 DEBUG Loader:1322 - result row: EntityKey[com.model.Person#1]
    18:16:23,147 TRACE BasicExtractor:70 - found [40] as column [age2_]
    18:16:23,147 TRACE BasicExtractor:70 - found [Marcos] as column [name2_]
    18:16:23,147 DEBUG AbstractBatcher:433 - about to close ResultSet (open ResultSets: 1, globally: 1)
    18:16:23,147 DEBUG AbstractBatcher:418 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1)
    18:16:23,148 DEBUG TwoPhaseLoad:130 - resolving associations for [com.model.Person#1]
    18:16:23,148 DEBUG TwoPhaseLoad:255 - done materializing entity [com.model.Person#1]
    18:16:23,148 DEBUG StatefulPersistenceContext:893 - initializing non-lazy collections

    • Alexssander, boa noite.

      Verifique se as entidades estão iguais as tabelas.

      Outro detalhes, verifique se o usuário utilizado está com direito de escrita na tabela.

      Obrigado pela visita.

        • Alexssander, infelizmente não tenho como te ajudar mais que isso.

          Você é o primeiro que relata esse tipo de problema, e eu não consigo imaginar o que seja.

          Eu teria que parar para analisar todo seu código algo que não tenho como fazer agora.

          Poste sua dúvida no GUJ para alguém que tenha tempo possa te ajudar.

          Att,

          • desculpa ja estou encomodando … acho q encontrei da uma olhada…

            Nov 11, 2013 11:40:56 AM com.sun.faces.context.flash.ELFlash getCurrentFlashManager
            GRAVE: JSF1094: Could not decode flash data from incoming cookie value Invalid characters in decrypted value.
            Processing will continue, but the flash is unavailable for this request.

            creio que seja a versão do javax.faces , qual é a versão utilizada? devo estar utilizando uma versão incompativel

          • Alexssander,

            Não sei te falar. No código fonte do post tem todas as bibliotecas usadas. Se você baixar e seguir a risca vai funcionar.

            Att,

          • viajei aqui cara desculpa , olha só o beleza do netbeans adicionou uma versão mais nova do javax.faces , apenas excluir ela e funcionou beleza , otimo site e otimo post obrigado pela sua atenção :D

  68. Opa! blz?

    Primeiramente, esse uaihebert aí tem haver com mineiro ???:D

    Velho, vc definiu uma estrutura dentro da webcontent nesse tutorial.
    Esta estrutura é configurada atraves do JSF ou vc utilizou de forma arbitrária?

    Por exemplo, vc definiu um diretório public e um protect. Tem como restringir acesso a esses diretórios com alguma configuração no JSF ou vc configurou isto no Tomcat ?

    vlw!
    Abraço!

    • Milton, bom dia.

      Realmente o uai é do meu lado mineiro mesmo. [=

      WebContent é a pasta que o Eclipse utiliza como “raiz” do war para um Dynamic Web project.

      No projeto tem um Filter que trata a questão de segurança e acesso a determinados recursos. [=

      Obrigado pela visita.

  69. Olá Hebert, boa tarde!

    Achei seu site nuns comentários lá no GUJ e testei esse seu projeto!…parabéns pela iniciativa!…vc é um excelente programador/professor!…acho que vou comprar seu livro lá na casa do código!

    Esse exemplo faz EXATAMENTE o que estou precisando fazer para terminar uma parte importante em meu TCC. Só que meu sistema está todo construído da forma como aprendi na apostila FJ26 da Caelum, ou seja, sem camada Façade, sem Converter, sem segurança, sem nada disso!…

    O conhecimento que estou aprendendo com a apostila é fantástico, e pra falar a verdade, de todos os exemplos que já vi na NET sobre JSF, esse é o mais fácil e o que menos se escreve código!

    Só que estou tentando adaptar seu exemplo em meu projeto, para poder terminar o que ainda me resta!…teria uma ideia de como eu poderia fazer isso?

    Você colocou a chamada dos métodos de negócio na camada Façade, eu aqui não faço tantas coisas, meus MB’s são os responsáveis por executar tudo o que preciso!!…só que caí numa situação NxN que não consigo sair!…testei seu exemplo e ele caiu como uma luva para o meu projeto. Só que passei a tarde toda de ontem e mais um pedaço da madrugada tentando adaptá-lo a minha necessidade, mas não consegui avançar!

    Sei perfeitamente que comparar seu trabalho com o trabalho da Caelum, não é nada ético(pode me xingar, se quiser!), mas o que não queria, era ter de refazer todo o meu trabalho, seguindo o seu exemplo, só porque não consegui implementar “à moda Caelum”, sacou?

    Estou aqui pensando nessa possibilidade, mas vou esperar sua resposta!!..boa tarde e bom feriado!!!

    • Leonardo, bom dia.

      O Façade tem como funcionalidade de separar as regras de negócio apenas, e nada mais.

      Se seu projeto (e o prazo também) está pequeno, deixe sem Façade mesmo e seja feliz. =P

      O Façade é uma camada a mais que serve para separar regra de negócios, que não influenciam em como um relacionamento NxN realmente funciona.

      No blog eu tiro dúvidas relacionadas ao post mesmo, e não a códigos fora do que foi explicado aqui. Se eu explicasse tudo que me é perguntando, eu não teria tempo nem de trabalhar… O.o

      Seria mais fácil você postar sua dúvida no GUJ.

      Obrigado pela visita. [=

  70. Opa…só mais uma pergunta!
    No seu livro, seus exemplos são passados da mesma forma do que no seu site?

    Achei uma forma interessante de aprender e estou pensando fortemente em comprar dois livros da casa do código!…(um deles é o seu)

    Semana passada fui até a unidade da Caelum, aqui no Rio, para ver se havia algum exemplar de amostra. Pra minha decepção, não havia!…

    • Leonardo, bom dia.

      No livro não mudou muito o modo como exponho as informações não, meu modo de falar é bastante parecido.

      Houveram ajustes e formatações por parte dos revisores mas é coisa pouca.

      Obrigado pelo apoio. [=

      OBS.: Essa semana sai livro novo se Deus quiser! =D

  71. Boa tarde!

    Terminei a pouco um treinamento de JavaSE e no fim houve uma introdução sobre JavaEE. Agora estou na luta para tentar encontrar um trabalho que me dê experiência, já que não tenho nenhuma em Java, e sou muito cru em programação. Enfim sempre que posso estou procurando textos, apostilas e afins, e lendo, pretendo desenvolver algum aplicativo web pra ir praticando enquanto não consigo uma vaga de Prog. Java Jr. que realmente seja JR rsrs, E quase sempre acabo em algum post seu, só quero lhe parabenizar pela iniciativa, paciência e boa vontade em compartilhar o que sabe. Seus posts são esclarecedores, espero que você possa continuar compartilhando suas experiências!

    att,

    Josemar

    • Josemar, boa tarde.

      Fico feliz por saber que estou ajudando.

      É bom saber que pessoas estão gostando do material aqui postado. =D

      Obrigado pelo retorno.

  72. Hebert, tudo bem? Seguindo os exemplos desse projeto que você criou (e adaptado às minhas necessidades reais), ao iniciar o Tomcat pelo Eclipse não ocorre nenhuma exceção, porém se eu reinicio o servidor ocorre a seguinte exceção:

    java.io.InvalidObjectException: Could not find a SessionFactory

    Isso não interfere no funcionamento da aplicação, mas como sou um pouco perfeccionista gostaria de eliminar isso. Faz ideia do porquê ocorre e como resolver?

    • Jonas, boa tarde.

      Não tenho como te dar uma resposta sem analisar todo seu código e tudo que você alterou.

      Você poderia postar seu código em algum fórum que alguém conseguirá analisar seu código e te dizer o que poderia estar errado.

      Obrigado pela visita.

  73. Estou tendo problema nestes trecho de código, o @SurpressWarning não está retirando o erro.


    @SuppressWarnings({ "unchecked", "rawtypes" })
    public List findAll() {
    CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
    cq.select(cq.from(entityClass));
    return em.createQuery(cq).getResultList();
    }

    ———————————————————————-

    Já tentei de tudo mesmo assim não consegui.

    • Matheus, boa tarde.

      Se você utilizar a mesma versão de bibliotecas e servidor indicada no post, você não terá problemas ou erros no seu projeto.

      Att,

      • A única coisa que estou usando de diferente é o netbeans, porém as bibliotecas estão todas iguais, e neste trecho do código estou tendo o problema, será que poderia me ajudar?

        • Matheus, bom dia.

          Não tenho como te dar suporte no Netbeans. Eu sei que ele tem uma gerência própria de bibliotecas e no momento nem o tenho instalado em minha máquina.

          Caso você tente fazer com Eclipse eu sei que o projeto funciona.

          Att,

          • Mudei para o eclipse, agora o erro está nos modelos, na hora que declaro o @entity ele da o erro Table “Usuario” cannot be resolved, esse erro consta em todas as classes modelos.

          • Matheus, bom dia.

            Você seguiu todos os passos? Até então, ninguém relatou esse tipo de problema.

            O que você poderia fazer era baixar o Eclispe + Tomcat (nas mesmas versões utilizadas nos posts) e importar o projeto.

            Obrigado pela visita.

  74. Hebert, minha dúvida é a seguinte: se eu seguir o exemplo desse projeto, configurando o hibernate do mesmo jeito e programando os DAO’s do mesmo jeito, levando em conta que meu projeto terá centenas de acessos simultâneos, “performaticamente” falando eu posso ter problemas futuros com isso? Eu devo implementar o pool de conexões ou seguindo o exemplo desse projeto não seria necessário? Em breve vou por em produção um projeto no qual eu me baseei nesse desenvolvido por você e tenho receio em relação à performance com o banco de dados.

    • Jonas, boa tarde.

      Já existe pool de conexão configurado para o projeto.

      Se seu projeto terá centenas de acesso, você já deve se preocupar com escalabilidade desde o começo.
      Você também não deve se preocupar apenas com banco de dados, mas sim com sessão http, segurança, máquinas e outras coisas.

      Obrigado pela visita.

      • Olá. Obrigado pela resposta. Agora fiquei um pouco confuso quando você diz que o projeto já está configurado com pool de conexões. Em qual página estaria essa configuração? Não teria que existir uma configuração com número máximo e mínimo de conexões, timeout, número máximo de statements, etc? Estava pensando em usar o c3p0 para gerenciar o pool…

          • Desculpe a insistência, mas não existe nenhum arquivo ‘context.xml’ nesse projeto. Talvez você esteja se confundindo com outro projeto. Mas agradeço a atenção.

          • Só um detalhe: estou usando o c3p0 agora. Eu estava com um problema de muitas conexões abertas. Percebi que o método ‘listAll’ começava com ‘classeDAO.beginTransaction()’ e no fim tinha o ‘classeDAO.closeTransaction()’ … o problema é que o ‘closeTransaction’ não fechava a conexão com o banco, e depois de um tempo a aplicação travava por causa disso porque chegava no limite conforme o ‘max_size’ configurado. Resumindo: a cada ‘listAll’ disparado era aberta uma conexão. Então, no método ‘listAll’ eu alterei de ‘closeTransaction’ para ‘commitAndCloseTransaction’ e o problema foi resolvido. O que você me diz disso? Será que existe uma forma mais correta de resolver essa situação?

          • Jonas, boa tarde. Realmente isso aí é um bug, preciso consertar. [=

            O problema é que ficou faltando finalizar a transação iniciada. >_<” No caso do projeto, quando vamos fazer uma consulta apenas para listar, não seria necessário nem abrir a transação. Se você apenas criar o EntityManager e disparar uma consulta, você já obterá o resultado da Query. A solução ideal seria: 1) Ter o servidor controlando a transação, utilizando EJB por exemplo. 2) Ter um framework que controle a transação, utilizando o Spring por exemplo. 3) Utilizar Open Session in View pattern. Obrigado pela visita.

  75. Olá Hebert, gostei muito do seu site e parabéns pela iniciativa e disposição para ajudar tanta gente.

    Estou com um problema aqui que talvez você posse me ajudar.

    O login não esta funcionando o primefaces e não esta pegando meu template que fica na pasta “/pages/template/”.

    Outra coisa que assim que entro no sistema, tudo funciona normalmente mas a URL continua “*/pages/public/login.xhtml” sendo que se entrar novamente nesta depois de logado o template e o prime funcionam mas mostra o formulário, como faço para exibir por exemplo… “Você já esta logado!”

    Muito obrigado e parabéns novamente!

    • Albert, boa noite.

      Te aconselho a baixar o código do projeto e verificar o que existe de diferente entre o código anexado e o seu código.

      Infelizmente os erros que você descreveu pode ser um erro que nem está relacionado ao seu problema, com isso ficaríamos dando tiro no escuro.

      Obrigado pela visita e pelo apoio.

  76. Olá Hebert, tudo bem?

    Estou re-fazendo esse projeto, mas baseado no meu que eu irei utilizar, e no momento ainda estou na perto do Facade, ainda nem cheguei no MB e etc, estou apenas testando/depurando a primeira parte para verificar como estão os relacionamentos no projeto.

    Porém, estou com um problema no momento de fazer o joinTransaction de um DAO para adicionar elementos em uma lista. A exceção que é lançada diz que não há nenhuma transação ativa, mas sendo chamado o beginTransaction() no primeiro DAO.

    Você tem uma ideia do que seria?

    Abração!

    • Ricardo, boa noite.

      Infelizmente não tenho como te ajudar sem realizar uma análise de código, e aqui não é bom para se postar código.

      Coloque sua dúvida no GUJ que alguém te ajudará.

      Uma dica que dou é comparar o seu código com o do projeto, pois o do projeto está funcionando.

      Obrigado pela visita.

  77. uaihebert! Boa Tarde!

    Já lhe agradeci antes por sua sempre preciosa vontade de ajudar e compartilhar conhecimento, mas aqui vai novamente meu obrigado! Bom sempre que eu tento começar um projeto web, tenho em mente que quero usar JSF + Primefaces + Hibernate. Porém sempre travo em uma dúvida conceitual, e eu não encontro nas minhas pesquisas uma resposta que me satisfaça, eu não sei se aqui é o melhor lugar pra lhe perguntar, mas eu esperava que você pudesse sanar minha dúvida. Quando eu vou trabalhar com JSF, como eu exatamente divido minha aplicação, eu sempre fico na dúvida sobre as regras de negócio, eu às coloco no ManagedBean, eu coloco nos POJOs que representam as entidades do meu BD, eu crio uma classe apenas para as regras de negócio? Eu sei que é uma dúvida um pouco tosca, mas isso realmente me impede de compreender muita coisa, espero que você possa me ajudar, e também que não esteja abusando de sua boa vontade.

    att,

    Josemar

    • Hebert,

      Quero pedir para você desconsiderar o comentário acima, li novamente o seu post, baixei os fontes, e consegui sanar minha dúvida! Confesso que faltou um pouco de atenção antes! Mas ainda sim obrigado!

      att,

      Josemar

    • Josemar, boa noite.

      Isso vai variar dos padrões que você vai utilizar, mas uma coisa eu digo: managed bean não é lugar para regra de negócio.

      ManagedBean é utilizado para controle de view.

      Eu criaria uma outra camada para as regras de negócio, poderia ser algo como: PessoaMB –> PessoaService –> PessoaRepository

      Obrigado pela visita.

      • ManagedBean – Regra apenas de tela
        Service – regra de negócio (lógica empresa por exemplo)
        Repository – regra de banco

        Eu gosto de trabalhar com service e repository.

        Este post é quase perfeito, faltou apenas o uso do MAVEN =D…

        • Alan, boa noite.

          Também gosto dessa estrutura. [=

          Espero esse ano ainda lançar uma nova versão com Maven. [=

          Obrigado pela visita e pelo apoio. [=

  78. Bom dia,

    uma duvida, trabalho com JSF + PRIMEFACES
    tenho uma tela de cadastro de cliente
    no campo nome, estou tentando utilizar autocomplete
    para vereficar se esse nome ja esta cadastrado..
    nao consigo fazer isso.. teria algum exemplo ?

    • Flavio, boa noite.

      Neste post tem um exemplo de como utilizar o auto complete. Basta você ajustar para o seu projeto.

      Obrigado pela visita

  79. Hebert, parabens pelo excelente trabalho.

    Estou carregando um DataTable, e ao clicar informo o ID para o meu MB e busco todos os dados no banco (até ai beleza).

    Populo o meu objeto que esta sendo referenciado na pagina, mais quando ele da o return com o endereço da pagina, nao abri a pagina, consegue me ajudar?

    Estou usando ViewScope

    Abraços

    • Ricardo, boa tarde.

      Honestamente não sei o que está acontecendo. Sei que se você der return apontando para uma página o escopo ViewScoped morre e um novo é criado.

      Se a página não está aparecendo pode ser que alguma exceção está acontecendo ou o endereço está errado.

      Obrigado pela visita e o apoio.

  80. Hebert, desculpe a minha total ignorância. Mas não estou conseguindo colocar para funcionar corretamente o seu projeto. Ele não esta criando as tabelas. Já configurei o arquivo persistence.xml e mesmo assim não consegui.

    Se tiver alguma outra dica, ficarei muito grato.

    Obrigado de qualquer maneira e parabéns pelo excelente trabalho!

    • Pedro, bom dia.

      Você tem que dar o run no servidor e depois acessar a página. [=

      Sem uma mensagem de erro não consigo ajudar mais. =/

      Obrigado pela visita.

  81. Galera que as libs para o hibernate e jsf, alguem tem ?

    Nao me manda pro site Official que ja fui la uma 10 vezes mais n funciona;

    Obrigado pela atenção;

  82. Olá Hebert, estou com o mesmo problema que o Jonas. Desenvolvi uma aplicação baseada neste projeto e o hibernate cria muitas conexões ultrapassando facilmente 100 conexões que ficam marcadas como “sleep” no mysql. Tudo está sendo devidamente tratado nas classes FACADEs, porém já não sei mais o que fazer. Você teria alguma sugestão?

      • Olá Hebert!
        Então, eu já tinha criado o pool e mesmo assim as conexões chegavam a estratosfera. Acabei mudando essa parte do projeto utilizando um OpenSessionInView e criei as NamedQuery para tratar as FetchLazys. Aí funcionou de boa.

        Mas fica aquela dúvida, porque gera tantas conexões? Tentei de tudo para manter o esquema que vc utilizou, até pq eu gostei muito. Mas gera muitas conexões. Considero vc dá uma olhadinha nesse projeto observando o banco de dados para consertar esse bug. Até pq há outras pessoas utilizando esse projeto como base, como o próprio Jonas.

        De qualquer forma parabéns pelo blog, está me ajudando muito. Em breve comprarei seu livro. Abração!

        • Edison, boa tarde.

          Esse projeto é apenas um exemplo e não coloquei um exemplo mais refinado por simplicidade.

          Utilizar OSIV não seria a solução, pois ele pode causar o efeito N+1.

          Posso ver depois se algum método não está fechando a conexão.

          Fico feliz que você conseguiu. [=

          Até a próxima.

        • Edison, passei pelo mesmo problema que você e consegui resolver o problema. O motivo dessas múltiplas conexões que ficam abertas no banco é um erro nos métodos de listagem no projeto do Hebert. Por exemplo, veja o código abaixo:

          public List listAll() {
          dogDAO.beginTransaction();
          List result = dogDAO.findAll();
          dogDAO.closeTransaction();
          return result;
          }

          1º erro: perceba que o Hebert está iniciando uma transação e isso não é necessário, pois na prática queremos apenas fazer um ‘select’ no banco. 2º erro: no fim ele usa o método ‘closeTransaction’, porém esse método não fecha a transação que foi aberta com o ‘beginTransaction’ (o nome desse método não condiz com aquilo que ele realmente faz). A transação só é fechada quando você der ‘commit’ ou ‘rollback’.

          Bem, agora vou mostrar como resolvi esse problema…

          Fiz algumas alterações na classe abstrata GenericDAO:

          abstract class GenericDAO implements Serializable {

          private static final long serialVersionUID = 1L;

          private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory(“IntranetPU”);
          private EntityManager em;

          private Class entityClass;

          public void createEntityManager() {
          em = emf.createEntityManager();
          }

          public Query createNativeQuery(String sql) {
          return em.createNativeQuery(sql);
          }

          public void closeEntityManager() {
          if (em.isOpen()) {
          em.close();
          }
          }

          public void beginTransaction() {
          createEntityManager();
          em.getTransaction().begin();
          }

          public void commit() {
          em.getTransaction().commit();
          }

          public void rollback() {
          em.getTransaction().rollback();
          }

          public void closeTransaction() {
          closeEntityManager();
          }

          public void commitAndCloseTransaction() {
          commit();
          closeTransaction();
          }

          public void flush() {
          em.flush();
          }

          public void joinTransaction() {
          createEntityManager();
          em.joinTransaction();
          }

          public GenericDAO(Class entityClass) {
          this.entityClass = entityClass;
          }

          public void save(T entity) {
          em.persist(entity);
          }

          public void delete(Object id, Class classe) {
          T entityToBeRemoved = em.getReference(classe, id);

          em.remove(entityToBeRemoved);
          }

          public T update(T entity) {
          return em.merge(entity);
          }

          public T find(int entityID) {
          return em.find(entityClass, entityID);
          }

          public T findReferenceOnly(int entityID) {
          return em.getReference(entityClass, entityID);
          }

          @SuppressWarnings({ “unchecked”, “rawtypes” })
          public List findAll() {
          CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
          cq.select(cq.from(entityClass));
          return em.createQuery(cq).getResultList();
          }

          @SuppressWarnings(“unchecked”)
          protected T findOneResult(String namedQuery, Map parameters) {
          T result = null;

          try {
          Query query = em.createNamedQuery(namedQuery);

          if (parameters != null && !parameters.isEmpty()) {
          populateQueryParameters(query, parameters);
          }

          result = (T) query.getSingleResult();

          } catch (NoResultException e) {
          System.out.println(“No result found for named query: ” + namedQuery);
          } catch (Exception e) {
          System.out.println(“Error while running query: ” + e.getMessage());
          e.printStackTrace();
          }

          return result;
          }

          @SuppressWarnings(“unchecked”)
          protected List findAllResults(String namedQuery, Map parameters) {
          List result = null;

          try {
          Query query = em.createNamedQuery(namedQuery);

          if (parameters != null && !parameters.isEmpty()) {
          populateQueryParameters(query, parameters);
          }

          result = (List) query.getResultList();

          } catch (NoResultException e) {
          System.out.println(“No result found for named query: ” + namedQuery);
          } catch (Exception e) {
          System.out.println(“Error while running query: ” + e.getMessage());
          e.printStackTrace();
          }

          return result;
          }

          @SuppressWarnings(“unchecked”)
          protected List findAllResultsNQ(String nativeQuery, Map parameters) {
          List result = null;

          try {
          Query query = em.createNativeQuery(nativeQuery);

          if (parameters != null && !parameters.isEmpty()) {
          populateQueryParameters(query, parameters);
          }

          result = query.getResultList();

          } catch (NoResultException e) {
          System.out.println(“No result found for named query: ” + nativeQuery);
          } catch (Exception e) {
          System.out.println(“Error while running query: ” + e.getMessage());
          e.printStackTrace();
          }

          return result;
          }

          private void populateQueryParameters(Query query, Map parameters) {
          for (Entry entry : parameters.entrySet()) {
          query.setParameter(entry.getKey(), entry.getValue());
          }
          }

          }

          E nos métodos onde eu quero apenas obter dados do banco, ou seja, onde não é necessário transação, eu faço o seguinte:

          public List listAll() {
          contatoGrupoDAO.createEntityManager();
          List result = contatoGrupoDAO.findAll();
          contatoGrupoDAO.closeEntityManager();
          return result;
          }

          E nos facades, nos métodos onde eu quero apenas um ‘select’ do banco, eu faço o seguinte:

          public List listAll() {
          contatoGrupoDAO.createEntityManager();
          List result = contatoGrupoDAO.findAll();
          contatoGrupoDAO.closeEntityManager();
          return result;
          }

          Com isso, não são mais geradas múltiplas transações e nem haverá problema de transações não fechadas.

          • Jonas, após muito tempo eu quero te agradecer pelo comentário.

            Acabei de editar o post e adicionar seu código (com pequenas alterações de generics).

            Muito obrigado pela contribuição. Eu não coloquei seu email, citei apenas pelo nome. Se você quiser, posso colocar seu email sem problemas.

            Até mais.

          • Mesmo com estas alterações minha aplicação está abrindo conexões e não as fecha. pode ser alguma outra coisa?

          • Marlon, boa tarde.

            Me desculpe mas eu procurei aqui e não encontrei nenhuma pergunta sua sobre conexão aberta.

    • Marlon, boa noite.

      Existe um método sobrecarregado do entityManager que aceita o objeto da chave composta.

      Obrigado pela visita.

  83. Olá Herbert,
    Não consigo entrar no seu sistema JSFCrudApp, Mapiei as classes no persistence:

    Crei 2 usuarios:
    insert into users (id, email, name, password, role) values (1, ‘ronicarlos7@gmail.com’, ‘Roni Carlos’,’740d9c49b11f3ada7b9112614a54be41′,’ADMIN’);– Senha: gerente

    insert into users (id, email, name, password, role) values (2, ‘dc.francisco@live.com’, ‘Francisco’,’9348c20a019be0318387c08df7a783d’,’USER’);– Senha: supervisor

    Quando tento entrar como “Role” ADMIN o e-mail e senha colocado no users no banco de dados, ME DÁ ESTE ERRO: An Error Occurred:

    java.lang.NoClassDefFoundError: Could not initialize class com.dao.UserDAO

    Poderia me dizer que erro é este?

    Obrigado

    • Francisco, bom dia.

      Existe algum outro erro acontecendo. Apenas pelo que está escrito aí não sei te falar.

      Poste sua dúvida no GUJ que alguém (se não eu) poderei analisar e te ajudar.

      Obrigado pela visita.

    • Francisco o endereço desta classe “com.dao.UserDAO” existe mesmo? Outra coisa no persistence.xml o caminho “com.dao.UserDAO” está mapeado na ?

      Att,

    • Vitor, boa tarde.

      Infelizmente não sei te falar ao certo.

      Procure algo como projeto web, mas eu não conheço o netbeans na parte de crianção de projetos.

      Obrigado pela visita.

  84. Bom , consegui executar o projeto utizei muitos exemplos como referencia e o conteudo eh muito bom , mas ja que estava funcionando eu nao devia ter mexido kkkkkk agora me deparo com um erro na hora conecta com o banco e nao esta criando ou atualizando as tabelas , ja to quebrando a cabeça aqui caso tenha alguma ajuda agradeço. ja desinstalei e instalei tudo denovo poderia ser os drivers mas ja estou confuso kk

    java.lang.AbstractMethodError: org.postgresql.jdbc2.Jdbc2DatabaseMetaData.getDatabaseMajorVersion()I

  85. Boa tarde hebert,
    O autocompletar identifica acentuação como poderia fazer para ao digitar medico ele trazer médico também.

    • Marcio, boa tarde.

      Nesse caso antes de executar a pesquisa, em sua classe java, você deve olhar se existe algum caracter com acentro e realizar a troca.

      Obrigado pela visita.

  86. Olá Herbert!

    Muito bom a aplicação exemplo! Fiquei com uma dúvida na questão dos filtros. Percebi que você criou 3 filtros de acesso, um genérico (/) e outros dois para ADMIN (…/admin) e USER (…/user). Se eu criasse somente um filtro de login (/protected) e baseado no perfil montasse um menu de acesso o usuário poderia acessar outra página da aplicação sem ter o perfil correto? Por exemplo, o usuário se conecta ao sistema e depois insere na mão uma URL de acesso administrativo. Neste caso ele já terá acesso liberado na sessão, mas não deveria ter acesso a esta página, pois é um usuário comum? Isso aconteceria? Se sim como poderia resolver?

    • Marcelo, boa tarde.

      Bastaria você verificar a URL do usuário nesse filtro único. Se ele está indo para uma área de ADMIN ele deveria ter /admin na url.

      Só tome cuidado com essa abordagem pois se uma pessoa fizer algo como /site/admin?user e no seu código você fizer algo como if(URL.contains(“user”))… você teria um furo de segurança.

      Obrigado pela visita.

  87. Olá Hebert, gostei do seu tutorial e do seu site, tem muito material bom aqui, tanto pra iniciantes quanto pra quem já é experiente. Uma pergunta, você tem este tutorial em pdf? Abraços.

    • Namor, boa tarde.

      Infelizmente eu não tenho como criar PDF. Só para criar o post eu já invisto quase uma semana.

      Obrigado pelo apoio.

  88. Excelente matéria!

    Acho que tu deverias fazer uma explicando melhor o uso de comboboxes com converter, visto que estou com dificuldades de fazer a persistência de dados de uma combo. Aparece uma mensagem de erro no converter sempre.

  89. Olá Hebert, primeiro parabéns pelo artigo. Gostaria de seguir esse tutorial utilizando Maven, mas estou com dificuldade para configurar o pom.xml, por favor você poderia postar o conteúdo do pom.xml para a aplicação desse tutorial? Muito obrigado.

    • Alex, boa tarde.

      Todo o código que tenho está disponível para download na última página, infelizmente não tenho como passar nada além disso. =/

      Obrigado pela visita.

  90. Olá Hebert, me tira uma dúvida, por que você não criou um interceptador para criar as transações e anotava os métodos de negócio com tipo @Transacao, para que o interceptador tivesse a responsabilidade de controlar a transação e não você “na mão”???

  91. Excelente tutorial, fiquei apenas na duvida do banco. Onde está o script? Essa tabela NxN não fica mapeada no hibernate? Faltou isso ai para eu testar.

    • Doutor Ricardo, boa tarde.

      Me perdoe a demora em responder, eu nem estava olhando aqui o blog pois estava focado no uaiMockServer.

      Fico muito feliz que você tenha conseguido resolver o seu problema.

      Até mais.

  92. Grande Hebert,

    As actions dos p:commandbuttons de dentro dos Dialog’s não são chamadas. Copiei o código da dogCreateDialog.xhtml e inseri dentro do form principal na página index.xhtml (retirando é claro a tag da dogCreateDialog.xhtml) e a chamada funcionou legal. Não sei mais o que fazer…

    Abraços!

    • Jorge, boa tarde.

      Me desculpe a demora, estive muito ocupado nesse último mês.

      Veja se não tem nenhum form dentro de outro form, isso pode dar problema. Tome cuidado também para caso a chamada seja ajax, utilizar o actionListener e não action.

      Obrigado por tudo e desculpe a demora.

  93. Muito show, exemplificou muito coisa. No arquivo persistence.xml o parametro hibernate.hbm2ddl.auto faz com que o proprio programa crie as tabelas?
    No codigo disponibilizado não tem os scripts das tabelas.

    • Krismorte, boa tarde.

      Exato, é essa configuração que faz com que as tabelas sejam criadas.

      Você só precisa criar o database.

      Obrigado pela visita.

      • Hebert, passei a tarde na luta o programa veio totalmente funcional. O problema esta na nova forma de chamar os dialags no Primefaces 5.0

        Subsitui todos os

        onclick="personDetailDialogWidget.show();"

        por


        onclick="PF('personDetailDialogWidget').hide();"

        Valeu pelo codigo!

        • Krismorte, bom dia.

          Infelizmente o Primefaces quando muda a versão, ele muda muita coisa. Inclusive ele faz alterações que comumente quebram o código antigo. =/

          Fico feliz que tenha conseguido.

          Obrigado pela visita.

Leave a Comment