Erro ao criar instância para uma classe EJB+primafaces

10 respostas
Tiago_Casanova

Bom estou fazendo um trabalhinho usando EJB, primfaces 3.3.1, GlassFish, NetBeans. Estou com o seguinte problema ao tentar rodar a pagina orcamento.xhtml tenho o seguinte erro:

javax.servlet.ServletException: Não é possível criar instância para·a classe: managedBeans.OrcamentoBean.
erro console:
Grave: Error Rendering View[/admin/Orcamento.xhtml]
com.sun.faces.mgbean.ManagedBeanCreationException: Não é possível criar instância para·a classe: managedBeans.OrcamentoBean.

A seguir minha interface,meu pojo, meu dao, meu bean e minha view

Pojo Orcamento

import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;

@Entity
public class Orcamento implements Serializable {

    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;
    
    @OneToOne
    @JoinColumn(name = "cliente_id")
    private Cliente cliente;
//    @OneToMany(cascade = CascadeType.ALL)
//    private ArrayList<Produto> produto = new ArrayList<Produto>();
    
    private String mensagem;
    
    private Double total;
    
    private String situacao;
    
    @Temporal(TemporalType.DATE)
    private Date datacadastro;

    public Orcamento() {
    }

    public Orcamento(Long id, Cliente cliente, String mensagem, Double total, String situacao, Date datacadastro) {
        this.id = id;
        this.cliente = cliente;
        this.mensagem = mensagem;
        this.total = total;
        this.situacao = situacao;
        this.datacadastro = datacadastro;
    }

  
    public Cliente getCliente() {
        return cliente;
    }

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

    public Double getTotal() {
        return total;
    }

    public void setTotal(Double total) {
        this.total = total;
    }

    public Date getDatacadastro() {
        return datacadastro;
    }

    public void setDatacadastro(Date datacadastro) {
        this.datacadastro = datacadastro;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    public String getSituacao() {
        return situacao;
    }

    public void setSituacao(String situacao) {
        this.situacao = situacao;
    }
}

Interface IOrcamento

import java.util.List;
import javax.ejb.Local;
import pojo.Cliente;
import pojo.Orcamento;

@Local
public interface IOrcamento {
      
    void SalvaOrcamento(Orcamento orcamento);
    
    List<Cliente> BuscaTodosCliente();
   
}

Meu DAO

import java.util.List;
import javax.ejb.*;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import pojo.Cliente;
import pojo.Orcamento;

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class OrcamentoDao implements IOrcamento {

    @PersistenceContext
    private EntityManager manager;
    
    public OrcamentoDao() {}

    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void SalvaOrcamento(Orcamento orcamento) {
        System.out.println("Entrou no medos do Salvar do Dao");
        manager.persist(orcamento);
        manager.flush();
        System.out.println("Orcamento Realizado com Sucesso! Id do Orcamento "+orcamento.getId());
        
    }
    
     @Override
    public List<Cliente> BuscaTodosCliente() {
        System.out.println("Entrou no buscadao");
       TypedQuery<Cliente> query = manager.createQuery("select c from cliente c", Cliente.class);
       return query.getResultList();
    }

}

Meu Bean Acho que o problema esta aqui…

import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import pojo.Cliente;
import pojo.Orcamento;

@ManagedBean
@SessionScoped 
public class OrcamentoBean {
    
    private Orcamento orcamento;
    List<Cliente> listarclientes =  new ArrayList<Cliente>();
    
    
    @EJB
    private IOrcamento orcamentoDao;
   
    public OrcamentoBean() {
        System.out.println("Entrou no construtor");
        orcamento = new Orcamento();
        listaclientes();     // vejamos se eu comentar esta linha ele CARREGA a view, o pior que é se eu tentar SALVAR ele salva o Orcamento no Banco.
    }
    // esse metodo é responsavel por trazer todos os clientes cadastrados no banco de dados
    public void listaclientes(){
        System.out.println("Entrou no listar clientes");
       listarclientes = orcamentoDao.BuscaTodosCliente(); 
         System.out.println("Saindo listar clientes");
    }
    
    public void listasituacoes(){}
    
    public void salvar(ActionEvent event) {
        System.out.println("Entrou no metodo salvar orcamento");
        orcamentoDao.SalvaOrcamento(orcamento);
        
          FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_INFO, "Orcamento Realizado com Sucesso!", ""));

          orcamento = new Orcamento();
        
    }

    public List<Cliente> getListarclientes() {
        return listarclientes;
    }

    public void setListarclientes(List<Cliente> listarclientes) {
        this.listarclientes = listarclientes;
    }


    public Orcamento getOrcamento() {
        return orcamento;
    }

    public void setOrcamento(Orcamento orcamento) {
        this.orcamento = orcamento;
    }

    public IOrcamento getOrcamentoDao() {
        return orcamentoDao;
    }

    public void setOrcamentoDao(IOrcamento orcamentoDao) {
        this.orcamentoDao = orcamentoDao;
    }    
}

Minha view

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">

    <ui:composition template="index.xhtml">  
        <ui:define name="conteudo"> 
            <h:head>
                <title>Cadastro Orçamento</title>
            </h:head>

            <h:body>
                <p:panel id="panel" header="Cadastro de Orçamentos" toggleable="false" closable="true" >

                    <p:growl/>        
                    <p:focus for="mensagem" />

                    <h:panelGrid columns="2" cellpadding="5">
                          <h:outputText  value="Cliente:"  /> 
                        <p:selectOneMenu id="cliente" value="#{orcamentoBean.orcamento.cliente}">  
                            <f:selectItem itemLabel="Selecione Cliente..." itemValue="" />  
                            <f:selectItems value="#{orcamentoBean.listaclientes}" />  
                        </p:selectOneMenu>  

                        <h:outputText  value="Mensagem:"  /> 
                        <p:editor id="mensagem" value="#{orcamentoBean.orcamento.mensagem}" width="600" required="true" requiredMessage="Campo Mensagem Indefinido!"/>  

                        <h:outputText  value="Situação:"  /> 
                        <p:selectOneMenu id="situacao" value="#{orcamentoBean.orcamento.situacao}">  
                            <f:selectItem itemLabel="Selecione Situação..." itemValue="" />  
                            <f:selectItems value="#{orcamentoBean.listasituacoes()}" />  
                        </p:selectOneMenu>
                        
                         <h:outputText  value="Total:"  />                    
                        <p:inputText id="total" value="#{orcamentoBean.orcamento.total}" required="true"  >
                            <f:validateLength minimum="4"/>
                        </p:inputText> 
                        
                          <h:outputText  value="Data:"  />
                         <p:calendar value="#{orcamentoBean.orcamento.datacadastro}" id="datacadastro" showOn="button" />  

                    </h:panelGrid>
                    <p:separator style="width: 90%; height: 5px" />                

                    <p:confirmDialog message="Deseja Cancelar?" showEffect="bounce" hideEffect="explode" modal="true"
                                     header="Cadastro Clientes" severity="info" widgetVar="confirmacao">

                        <p:commandButton value="Sim"  oncomplete="confirmacao.hide()" 
                                         onclick="window.location.href='index.xhtml'"/>
                        <p:commandButton value="Não" update="panel" onclick="confirmacao.hide()" type="button"/>
                    </p:confirmDialog>

                    <p:spacer width="30" height="10" />
                    <p:commandButton value="Salvar" actionListener="#{orcamentoBean.salvar}" update="panel" />
                    <p:spacer width="50" height="10" />
                    <p:commandButton value="Cancelar"  onclick="confirmacao.show()" />

                </p:panel> 

            </h:body>
        </ui:define>
    </ui:composition>
</html>

Lembrando se eu comentar o método da classe OrcamentoBean chamado listarclientes() ele funciona, carrega view e até salva o orcamento. Alguem ja passou por isso???

10 Respostas

Hebert_Coelho

Faça um debug. Eu acho que o seu EJB não está sendo injetado.

Tiago_Casanova

Entao Hebert Coelho olhando o console do glassFish ele injeta:

Informações: Portable JNDI names for EJB OrcamentoDao : [java:global/SistemaInformatica/SistemaInformatica-ejb/OrcamentoDao!interfac.IOrcamento, java:global/SistemaInformatica/SistemaInformatica-ejb/OrcamentoDao]
Informações: Portable JNDI names for EJB ClienteDao : [java:global/SistemaInformatica/SistemaInformatica-ejb/ClienteDao!interfac.ICliente, java:global/SistemaInformatica/SistemaInformatica-ejb/ClienteDao]

olha o console do erro que da ao tentar renderizar a view:

Rodrigo_Sasaki

Caused by: java.lang.NullPointerException
at managedBeans.OrcamentoBean.listaclientes(OrcamentoBean.java:38 )

Algo está errado no seu método listaclientes além do nome dele que não segue os padrões.

Na linha 38 você está tentando utilizar uma variável de referência que está nula.

rmendes08

O seu problema é justamente esse, você não pode usar um EJB dentro do construtor (ou dentro de um método chamado pelo construtor), isso porque a injeção de dependências só vai acontecer depois que o ManagedBean estiver contruído. De maneira geral, não é uma prática muito interessante colocar regras no construtor. Ainda mais quando se trata de objetos gerenciados pelo conteiner de aplicação.

Hebert_Coelho

Bem, eu prometo que não acertei no chute! =P

O construtor não é o lugar ideal para se colocar códigos. Nem para MB nem para EJBs.

O construtor pode ser chamado antes que todos os recursos tenham sido injetados, com isso você não irá conseguir utilizar.

O correto é criar um método qualquer e anotar com @PostConstrut. O próprio servidor chamará esse método depois que ele injetar todo mundo. [=

Te aconselho a ler o livro JSF [: Core JavaServer Faces 3rd ? Cay Horstmann, David Geary

Tiago_Casanova

Valeu pela ajuda, estava faltando a anotação @PostConstruct, estou com mais um problema em salvar o objeto cliente_id no banco…
ele da o erro

Erro de conversão ao definir o valor ‘1401’ para ‘null Converter’.

na minha view o select esta assim

<h:outputText  value="Cliente:"  /> 
                        <p:selectOneMenu id="cliente" value="#{orcamentoBean.orcamento.cliente}">  
                            <f:selectItem itemLabel="Selecione Cliente..." itemValue="" noSelectionOption="true" />  
                            <f:selectItems value="#{orcamentoBean.listarclientes}" var="c" itemLabel="#{c.nome}"   itemValue="#{c.id}"  />  
                                     //se eu passar itemValue="#{c}" ele tbm da pau
                        </p:selectOneMenu>

Metodo do bean que recupera um Array de clientes

@PostConstruct
    public void ListaClientes(){
       listarclientes = orcamentoDao.BuscaTodosCliente(); 
    }

Minha classe pojo esta no começo desse post…
Alguém ja passou por isso??

Hebert_Coelho

JSF: Converter e Bean Auto Complete

Tiago_Casanova

Não existe outra forma de fazer, tem que implementar o Converters???
Pois pesquisando encontrei esse link http://www.guj.com.br/java/250300-resolvidocomo-pegar-objeto-do-componente-selectonemenu-do-primefaces-3 la ele consegue mas não entendi a questão <p:selectOneMenu value="#{contatoMB.contato.grupo.id}"> como ele pega o grupo.id, pois ele nao posta a classe pojo, no meu caso eu fizer assim

<p:selectOneMenu id="cliente" value="#{orcamentoBean.orcamento.cliente.id}" required="true" requiredMessage="Selecione um Cliente!">  
                            <f:selectItem itemLabel="Selecione Cliente..." itemValue="" noSelectionOption="true" />  
                            <f:selectItems value="#{orcamentoBean.listarclientes}" var="c" itemLabel="#{c.nome}"   itemValue="#{c}"  />  
                        </p:selectOneMenu>

Ele da o erro

Hebert_Coelho

Tiago Casanova:
Não existe outra forma de fazer, tem que implementar o Converters???
Pois pesquisando encontrei esse link http://www.guj.com.br/java/250300-resolvidocomo-pegar-objeto-do-componente-selectonemenu-do-primefaces-3 la ele consegue mas não entendi a questão <p:selectOneMenu value="#{contatoMB.contato.grupo.id}"> como ele pega o grupo.id, pois ele nao posta a classe pojo, no meu caso eu fizer assim

<p:selectOneMenu id="cliente" value="#{orcamentoBean.orcamento.cliente.id}" required="true" requiredMessage="Selecione um Cliente!">  
                            <f:selectItem itemLabel="Selecione Cliente..." itemValue="" noSelectionOption="true" />  
                            <f:selectItems value="#{orcamentoBean.listarclientes}" var="c" itemLabel="#{c.nome}"   itemValue="#{c}"  />  
                        </p:selectOneMenu>

Ele da o erro

javax.el.PropertyNotFoundException: /admin/Orcamento.xhtml @24,157 value="#{orcamentoBean.orcamento.cliente.id}": Target Unreachable, ‘null’ returned null
Para resolver esse erro, basta fazer um if no get do orçamento: if(orcamento == null) this.orcamento = orcamento;

Quando ao converter é preciso que você estude o JSF para entender o seu conceito e sua aplicação. O post que eu passei fala um pouco sobre isso.

PePeLeGaL

O problema relacionado ao @PostConstruct está ocorrendo comigo. Veja abaixo como eu fiz. Alguem sabe como posso resolve-lo, por gentileza?

O erro está na linha: List registros = this.getColunaTabelaServico().findByColumn(Area.class.getSimpleName());

É como se eu nao tivesse colocado o @PostConstruct

public AreaController() {

        init();

    }

    @PostConstruct
    public void init(){
        
        //Colunas
        List<String> colunasSource = new ArrayList<String>();
        List<String> colunasTarget = new ArrayList<String>();

        //buscar colunas. 
        List<ColunaTabela> registros = this.getColunaTabelaServico().findByColumn(Area.class.getSimpleName());
                
        //se visivel, colocar em colunasTarget. se oculta, colocar em colunasSource.
        for(ColunaTabela colunaTabela : registros){
            if(colunaTabela.getVisivel().equals(true)){
                colunasTarget.add(colunaTabela.getNome());
            } else if(colunaTabela.getVisivel().equals(false)){
                colunasSource.add(colunaTabela.getNome());
            }
        }

        colunas = new DualListModel<String>(colunasSource, colunasTarget);
    }
Criado 2 de outubro de 2012
Ultima resposta 25 de abr. de 2013
Respostas 10
Participantes 5