尝试从通用 Class 扩展 EJB:IllegalArgumentException 参数 {0} 不是 EJB {1} 的有效本地客户端视图

Trying to extend an EJB from a Generic Class: IllegalArgumentException The Argument {0} is not a valid local client view for the EJB {1}

我正在尝试从通用 class 扩展 EJB,如下所示:

  1. 我的抽象泛型 Class:

    public abstract class CrudDAO<T> {
    
         @PersistenceContext(unitName = "MYPU")
         protected EntityManager em;
    
         protected Class<T> entityClass;
    
         public int count() {
              Query count = em.createQuery("select count(u) from " +     entityClass.getSimpleName() + " u");
              return Integer.parseInt(count.getSingleResult().toString());
         }
    
         public T create(T entity){
              em.persist(entity);
              return entity;
        }
    
        public T update(T entity){
            return em.merge(entity);
        }
    
        public void delete(int id) {
            T entity = em.find(entityClass, id);
            em.remove(entity);
        }
    
        public T find(int id){
            return em.find(entityClass, id);
        }
    
        public List<T> findAll(Integer page, Integer maxRecords) {
            Query q = em.createQuery("select u from " + entityClass.getSimpleName() + " u");
            if (page != null && maxRecords != null) {
                q.setFirstResult((page - 1) * maxRecords);
                q.setMaxResults(maxRecords);
            }
            return q.getResultList();
        }
    
        public<V> List<V> executeListNamedQuery(String name){
            return em.createNamedQuery(name).getResultList();
        }
    
        public<V> List<V> executeListNamedQuery(String name, Map<String,Object> params){
            Query q = em.createNamedQuery(name);
            for (Map.Entry<String, Object> entry : params.entrySet()) {
                q.setParameter(entry.getKey(), entry.getValue());
            }
            return q.getResultList();
        }
    
        public<V> V executeSingleNamedQuery(String name){
            List<V> lista = em.createNamedQuery(name).getResultList();
            if(!lista.isEmpty()){
                return lista.get(0);
            }
            return null;
        }
    
        public<V> V executeSingleNamedQuery(String name, Map<String,Object> params){
            Query q = em.createNamedQuery(name);
            for (Map.Entry<String, Object> entry : params.entrySet()) {
                q.setParameter(entry.getKey(), entry.getValue());
            }
            List<V> lista = q.getResultList();
            if(!lista.isEmpty()){
                return lista.get(0);
            }
            return null;
        }
    }
    
  2. 我的 EJB 逻辑

    @Stateless
    public class UsuarioDAO extends CrudDAO<UsuarioEntity>{
        public UsuarioDAO() {
            this.entityClass = UsuarioEntity.class;
        }
    }
    
  3. 我的实体只有 getter 和 setter

  4. 我有另一个注入 UsuarioDAO 并通过接口向 Restfull 服务公开方法的 EJB。

    @Stateless
    public class AuthBean implements IAuthServiceBean {
    
        @Inject
        private UsuarioDAO usuarioDAO;
    
        @Override
        public UsuarioEntity agregarUsuario(UsuarioEntity usuario) {
            return usuarioSpadiesDAO.create(usuario);
        }
    }
    

我的 Restfull 服务调用 agregarUsuario 注入 AuthBean。我的问题是当我尝试访问 Restfull 服务时它抛出了这个异常:

The argument package.to.dao.CrudDAO is not a valid local client view for the EJB UsuarioDAO(Application: <MyEarSnapShot>, EJBComponent: <MyWarSnapshot>)

我有一个包含 WAR 和 EJB 组件的 EAR。 EJB 组件是 WAR 组件的依赖项。 Restfull Services 在 WAR 组件中,其他东西在 EJB 组件中。

我正在使用 WebLogic 12c 进行部署。

安装补丁 19533331 解决了我的问题。

19533331 依赖注入 12.1.3.0.3 CDI 在处理 EJB 时不考虑 EJB 的所有超类和接口。