Problemas com CDI com um ejb injetando outro

Olá.Tudo bem?
estou tendo problemas ao usar CDI em minha aplicação.
Em minha aplicação tenho um managedBean, nele é injetado um EJB stateless de classe de negócio.

Esse ejb por sua vez possui como dependência outro ejb stateless, servindo de dao, o qual possui o EntityManager.
O problema é que no managedBean o ejb de serviço é instanciado, porém na classe de serviço o ejb do dao não, ficando como null.

Alguém já passou por esse tipo de coisa poderia me ajudar?
OBS: Percebi que se colocar na classe de serviço a anotação @EJB, a qual não é do CDI o objeto DAO é instanciado.

Vou passar as classes para entenderem o problema.

ManagedBean

@ManagedBean
@ViewScoped
public class CategoriaBean implements Serializable{

    private static final long serialVersionUID = -1514602559760951476L;
    private Categoria categoria;
    private List<Tipocategoria> listaTipoCategoria = null;
    private int valorTipoCategoria;
    
    @Inject
    private CategoriaService categoriaService;

    
    public String save(){
	categoria.setTipoCategoria(Tipocategoria.valueOf(categoria.getValorTipoCategoria()));
	categoria.setId(null);
	categoriaService.save(categoria);
	//categoriaDAO.save(categoria);
	FacesContext context = FacesContext.getCurrentInstance();
	String mensagem = "";
	try {
	    ResourceBundle bundle = ResourceBundle.getBundle("messages", context.getViewRoot().getLocale());
	    mensagem = bundle.getString("sucesso.label");
	} catch (Exception e) {
	    System.out.println("EXCEPTION: " + e);
	}
	FacesContext.getCurrentInstance().addMessage("", new FacesMessage(FacesMessage.SEVERITY_INFO,mensagem,mensagem));
	preparaBean();
	return null;
    }
}

EJB de serviço

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class CategoriaServiceImpl implements CategoriaService,Serializable {
    
    /**
     * 
     */
    private static final long serialVersionUID = -311290272957953479L;
    @Inject
    private transient CategoriaDAO categoriaDAO;
    
    /**
     * @return the categoriaDAO
     */
    public CategoriaDAO getCategoriaDAO() {
        return categoriaDAO;
    }

    /**
     * @param categoriaDAO the categoriaDAO to set
     */
    public void setCategoriaDAO(CategoriaDAO categoriaDAO) {
        this.categoriaDAO = categoriaDAO;
    }
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void save(Categoria categoria){
	categoriaDAO.save(categoria);
    }

}

EJB com o entityManager DAO

/**
 * 
 */
package br.com.learningjsf.dao;

import java.io.Serializable;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import br.com.learningjsf.entity.Categoria;

/**
 * @author leandro
 *
 */
@Stateless
public class CategoriaDAOImpl implements CategoriaDAO,Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -3905074532334294052L;
    @PersistenceContext
    private EntityManager entityManager;
    
    /**
     * @return the entityManager
     */
    public EntityManager getEntityManager() {
        return entityManager;
    }

    /**
     * @param entityManager the entityManager to set
     */
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public void save(Categoria categoria) {
	entityManager.persist(categoria);
	
    }

}

no EJB de serviço

coloque @EJB e não @Inject
e outra eu não coloco transient
apenas deixo private

[code]@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class CategoriaServiceImpl implements CategoriaService,Serializable {

/** 
 *  
 */  
private static final long serialVersionUID = -311290272957953479L;  
@EJB
CategoriaDAO categoriaDAO;  [/code]

e la no bean você mantem @Inject
e troque o @ManagedBean para @Named
e o escopo @ViewScoped não vai funcionar

[code]
@Named
@SessionScoped
public class CategoriaBean implements Serializable{

private static final long serialVersionUID = -1514602559760951476L;  
private Categoria categoria;  
private List<Tipocategoria> listaTipoCategoria = null;  
private int valorTipoCategoria;  
  
@Inject  
private CategoriaService categoriaService;  [/code]

O @ViewScoped não funciona com CDI, caso queira usar vai ter que usar biblioteca de terceiro compativel com CDI

Então porque tenho que colocar no ejb do dao a partir do serviço o @Ejb e não @Inject ?

E eu estava usando @ViewScoped e a injeção no ejb de serviço funcionou a partir do managed bean.

[quote=lele_vader]Então porque tenho que colocar no ejb do dao a partir do serviço o @Ejb e não @Inject ?

E eu estava usando @ViewScoped e a injeção no ejb de serviço funcionou a partir do managed bean.[/quote]

o carinha fez a mesma pergunta que vc…leia a resposta
https://groups.google.com/forum/?fromgroups=#!topic/jug-ms/XUq9j7uxSFc

o @ViewScoped funciona em partes com CDI eu tive problemas e atualmente estou usando esse projeto mainstream
para poder usar o @ViewScoped

https://cwiki.apache.org/EXTCDI/

Att

Esse CODI é um dos projetos que vai virar o delta spike não é ?

Tudo bem.
Porém porque preciso colocar @EJB no ejb de serviço para injetar o dao ?

Não serviria um outro @Inject ?

E os meus ejb são todos locais.
Eu acabei implementando uma interface e nela está o @Local.

Eu quero fazer quase a mesma coisa que esse exemplo aqui.

Veja que nele o BigManager injeta o BidService e a implementação de BidService injeta um BidDao .

Alguém mais já tentou isso ?

CDI não funciona corretamente com @ManagedBean, tentou mudar para @Named, vai precisar mudar também o escopo para um escopo do enterprise context, tente o @SessionScoped,

Referente ao @Inject, não sei se será possível utilizar ele direto na camada service instanciando um ejb, pois o Inject faz parte do CDI e não vai tratar as transações do ejb, o que a anotação @EJB faz.

Aqui utilizamos @EJB para ejbs da camada DAO, e @Inject para os serviços na camada view.

dei uma pesquisada aqui, e parece que para você usar o @Inject ao invés do ejb, você precisa criar um @Produces, não sei se compensa

da 1 olhada:

http://stackoverflow.com/questions/5060314/inject-a-stateless-ejb-with-inject-into-cdi-weld-managedbean-jsf-1-2-ejb-appli

EU já tinha conseguido esse efeito com o @EJB da camada de serviço para o dao mesmo, porém como estava dando null resolvi criar o tópico.
Considerando que o pessoal daqui parece fazer assim vou continuar.
Sobre o CDI não funcionar com o @ManagedBean o estranho é que ele injeta o serviço com @Inject e o managedBean estando com view scope.

O problema é que se eu deixar o managedBean com escopo de session imagino que se eu consultar um dado e ele preencher em um objeto do model.Após isso eu sair da tela e voltar nela, será apresentado o objeto anteriormente consultado não é, o que não aconteceria com View scope.
Estou correto ?