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

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???

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

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:

[quote]Caused by: java.lang.NullPointerException
at managedBeans.OrcamentoBean.listaclientes(OrcamentoBean.java:38 ) [/quote]
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.

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.

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

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 [quote] Erro de conversão ao definir o valor ‘1401’ para ‘null Converter’.[/quote]

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??

JSF: Converter e Bean Auto Complete

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

[quote=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

[quote]javax.el.PropertyNotFoundException: /admin/Orcamento.xhtml @24,157 value="#{orcamentoBean.orcamento.cliente.id}": Target Unreachable, ‘null’ returned null[/quote][/quote]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.

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);
    }