Duvida EJB 3.1 com Generics

Tenho um projeto com EJB 3.1 estou querendo criar um Bean genérico com métodos padrão para minha estrutura ficou assim:

Classe que define um domínio de entidades do negócio

public interface IBaseEntity extends Serializable {

}

public interface IBaseBean<T extends IBaseEntity> extends Serializable {
	public T cadastrar(T entity) throws Exception;
	public Boolean completeEntity(T entity) throws Exception;
}

@Stateless
@Remote
public class BaseBean<T extends IBaseEntity, DAO extends IGenericDAO<T>> implements IBaseBean<T> {

	private static final long serialVersionUID = -5981137777669254041L;

	@EJB
	DAO dao;

	public T cadastrar(T entity) throws Exception {
		if (completeEntity(entity)){
			dao.merge(entity);
		}
		return entity;
	}
	public Boolean completeEntity(T entity) throws Exception {
		return Boolean.TRUE;
	}
}
//OBS: ClienteEntity implementa IBaseEntity
public interface IClienteBean extends IBaseBean<ClienteEntity> {
	
}
@Stateless
@Remote(IClienteBean.class)
public class ClienteBean extends BaseBean<ClienteEntity, IGenericDAO<ClienteEntity>> implements IClienteBean {

	@Override
	public Boolean completeEntity(ClienteEntity entity) throws Exception {
		ClienteEntity cliente = (ClienteEntity)entity;
                //valida as obrigatoriedades
		return Boolean.TRUE;
	}

}


public abstract class AppBaseMB<T extends IBaseEntity, BEAN extends IBaseBean<T>> implements Serializable {

	private static final long serialVersionUID = 2956648193779364086L;

	@EJB
	private BEAN baseBean;
	
	private T entity;

	public T getEntity() {
		return entity;
	}
	
	public void setEntity(T entity) {
		this.entity = entity;
	}
	
	public void cadastrar() {
		try {
			baseBean.cadastrar(entity);
		} catch (Exception e) {
			System.out.println(e);
		}
	}
	
	public void onTabChange(TabChangeEvent event) {  
        FacesMessage msg = new FacesMessage(event.getTab().getTitle());  
  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    } 
}

@ManagedBean
@ViewScoped
public class CadastrarClienteMB extends AppBaseMB<ClienteEntity, IClienteBean> {

	private static final long serialVersionUID = 2125463919135769978L;

	@PostConstruct
	public void init() {
		setEntity(new ClienteEntity());
		inicializaCliente(getEntity());
	}

	private void inicializaCliente(Cliente cliente) {
                //regra de inicialização do cliente
	}

	public CadastrarClienteDetailMB getCadastrarClienteDetailMB() {
		return cadastrarClienteDetailMB;
	}

	public void setCadastrarClienteDetailMB(
			CadastrarClienteDetailMB cadastrarClienteDetailMB) {
		this.cadastrarClienteDetailMB = cadastrarClienteDetailMB;
	}
}

Não está dando erro quando eu subo o servidor porem eu estou chamando o caso de uso com a classe CadastrarClienteMB que por sua vez utilizará o ClienteBean e como entidade do caso de uso ClienteEntity, e na classe AppBaseMB o ejb não consegue instanciar a classe correta ele deveria criar um bean para IClienteBean só que está criando para IBaseBean e sem o tipo genérico com isso eu não consigo acessar o método completeEntity sobescrito na classe ClienteBem para validar a entidade. alguém já tentou implementar alguma coisa parecida ou sabe onde pode estar o erro?

estou utilizando o JBoss 7 como container!

O problema acontece por causa de como os genéricos são implementados em Java. A informação de tipos genéricos é removida após a compilação, por um processo chamado “type erasure”. Nesse processo, o compilador substitui as variáveis de tipo pelo tipo do limitante superior. Sendo assim, no caso da classe AppBaseMB, o tipo genérico BEAN será substituído por IBaseBean após a compilação.

Por outro lado, as injeções de dependência acontecem durante a execução do seu aplicativo, justamente quando toda a informação de tipo já foi removida. Sendo assim, ao encontrar um campo anotado com @EJB e com o tipo IBaseBean, o conteiner vai usar o primeiro EJB que ele encontrar que é compatível com o tipo da variável. Uma maneira de contornar esse problema seria fornecer explicitamente para a anotação o nome do EJB que será injetado na variável.

Na minha opinião, esse seu projeto baseado em herança e generics tá complicado demais. Herança gera um acoplamento muito forte entre as suas classes, e em se tratando de classes gerenciadas pelo conteiner, isso é um problema maior ainda. No fim, você joga pela pia todo a facilidade e baixo acoplamento que a injeção de dependências te oferece.

rmendes08 obrigado pela resposta, eu dei uma viajada boa nesta arquitetura ai, tirando o problema do alto acoplamento pra mim não pareceu tão complicada, você falou que eu poderia fornecer explicitamente para a anotação o nome do EJB que será injetado na variável BEAN, isso pode ser feito dinamicamente? ou você teria o link para ma aplicação que eu possa utilizar como modelo desacoplado do jeito que você falou?