Problema com DefaultDao [java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType]

Pessoal,

Veja a minha implementação de código para um Dao com Jpa

Interface Dao

public interface Dao<K, E> {
    
    public void persist(E entity);
    public void remove(E entity);
    public void merge(E entity);
    public E find(K id);
    public List<E> getAll();
       
}

Classe abstrata de implementação do Dao

public abstract class DefaultJpaDao<K, E> implements Dao<K, E> {

    protected Class<E> entityClass;
    
    @PersistenceContext(unitName = "ejbPU")
    protected EntityManager entityManager;

    public DefaultJpaDao() {
        ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
        this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[1];
    }

    @Override
    public void persist(E entity) {
        entityManager.persist(entity);
    }

    @Override
    public void remove(E entity) {
        E removeEntiy = entityManager.merge(entity);
        entityManager.remove(removeEntiy);
    }

    @Override
    public void merge(E entity) {
        entityManager.merge(entity);
    }

    @Override
    public E find(K id) {
        return entityManager.find(entityClass, id);
    }

    @Override
    public List<E> getAll() {
        Query query = entityManager.createQuery("SELECT e FROM " + entityClass.getSimpleName() + " e");
        return query.getResultList();
    }
}

Interface que extende a interface Dao (nao tem os métodos especificos ainda

public interface DaoBras extends Dao<String, Bras> {
    
    
}

Classe que implementa a interface anterior e estende a classe abstrada

@Stateless(name="daoBras")
@LocalBean()
public class DaoBrasJpa extends DefaultJpaDao<String, Bras> implements DaoBras {
        
}

Agora como eu chamo este EJB

  @EJB(name="daoBras")
    private DaoBras daoBras;

Quando eu rodo a aplicação recebo esta mensagem:

Grave: Exception while loading the app : EJB Container initialization error
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
	at br.com.gvt.acct.dao.DefaultJpaDao.<init>(DefaultJpaDao.java:25)
	at br.com.gvt.acct.dao.DaoBrasJpa.<init>(DaoBrasJpa.java:17)
	at br.com.gvt.acct.dao.__EJB31_Generated__DaoBrasJpa__Intf____Bean__.<init>(Unknown Source)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
	at java.lang.Class.newInstance0(Class.java:372)
	at java.lang.Class.newInstance(Class.java:325)
	at com.sun.ejb.containers.BaseContainer.instantiateOptionalEJBLocalBusinessObjectImpl(BaseContainer.java:3887)
	at com.sun.ejb.containers.StatelessSessionContainer.initializeHome(StatelessSessionContainer.java:253)
	at com.sun.ejb.containers.ContainerFactoryImpl.createContainer(ContainerFactoryImpl.java:167)
	at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:230)
	at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:299)
	at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:105)
	at org.glassfish.internal.data.ModuleInfo.load(ModuleInfo.java:186)
	at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:264)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:460)
	at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
	at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291)
	at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259)
	at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461)
	at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212)
	at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179)
	at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:722)
public class DaoBrasJpa extends DefaultJpaDao<String, Bras> implements DaoBras {

A classe DaoBrasJpa também tem que ser genérica… troque DaoBrasJpa por DaoBrasJpa<String, Bras>

Abraço.

Mas ja nao esta assim?

Perdao, entendi errado, porém fiz a alteração e o Netbeans já acusou erro.

Todos as classes que estendem ou implementam uma versão ou a própria Interface Dao<String, Bras> devem também possuir a assinatura genérica <K, E>… A interface DaoBras estende Dao<String, Bras> logo deveria ser genérica também, DaoBras<K, E>. A classe DaoBrasJpa estende DefaultJpaDao<String, Bras> logo também deve ser genérica, DaoBrasJpa<K, E>.

Pois senão…

ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();  

DaoBrasJpa que é DefaultJpaDao<String, Bras> vai invocar o contrutor DefaultJpaDao()… e DaoBrasJpa não suporta getClass().getGenericSuperclass(), pois ele não é genérico.

Cara, nao ta rolando, fiz assim:

Interface que estende a interfade Dao genérica.

public interface DaoBras<K,T> extends Dao<String, Bras> {
    
    
}

Classe que implementa a DaoBras e estende a classe abstrada DefaultDao

public class DaoBrasJpa<K,T> extends DefaultJpaDao<String, Bras> implements DaoBras<String,Bras> {
                
}

continuo recebendo o mesmo erro

Kra,

Segui exatamente esse tutorial:

https://community.jboss.org/wiki/GenericDataAccessObjects?_sscc=t#The_DAO_interfaces

mesmo assim da o mesmo problema.