我正在尝试从通用类扩展 EJB,如下所示:
我的抽象通用类:
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; } }
我的 EJB 逻辑
@Stateless public class UsuarioDAO extends CrudDAO<UsuarioEntity>{ public UsuarioDAO() { this.entityClass = UsuarioEntity.class; } }
我的实体只有 getter 和 setter
我有另一个 EJB,它注入(inject)
UsuarioDAO
并通过接口(interface)向 Restfull 服务公开方法。@Stateless public class AuthBean implements IAuthServiceBean { @Inject private UsuarioDAO usuarioDAO; @Override public UsuarioEntity agregarUsuario(UsuarioEntity usuario) { return usuarioSpadiesDAO.create(usuario); } }
我的 Restfull 服务调用 agregarUsuario 注入(inject) AuthBean。我的问题是当我尝试访问 Restfull 服务时它会抛出此异常:
The argument package.to.dao.CrudDAO is not a valid local client view for the EJB UsuarioDAO(Application: <MyEarSnapShot>, EJBComponent: <MyWarSnapshot>)
我有一个 EAR,其中包含一个 WAR 和一个 EJB 组件。 EJB组件是WAR组件的依赖项。 Restfull Services在WAR组件中,其他东西在EJB组件中。
我使用 WebLogic 12c 进行部署。
最佳答案
安装补丁 19533331 解决了我的问题。
19533331 依赖注入(inject) 12.1.3.0.3 CDI 在处理 EJB 时不考虑 EJB 的所有父类(super class)和接口(interface)。
关于java - 尝试从通用类扩展 EJB : IllegalArgumentException The Argument {0} is not a valid local client view for the EJB {1},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33862780/