尝试从通用 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,如下所示:
我的抽象泛型 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;
}
}
我的 EJB 逻辑
@Stateless
public class UsuarioDAO extends CrudDAO<UsuarioEntity>{
public UsuarioDAO() {
this.entityClass = UsuarioEntity.class;
}
}
我的实体只有 getter 和 setter
我有另一个注入 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 的所有超类和接口。
我正在尝试从通用 class 扩展 EJB,如下所示:
我的抽象泛型 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; } }
我的 EJB 逻辑
@Stateless public class UsuarioDAO extends CrudDAO<UsuarioEntity>{ public UsuarioDAO() { this.entityClass = UsuarioEntity.class; } }
我的实体只有 getter 和 setter
我有另一个注入
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 的所有超类和接口。