我上课了:
public class GenericDAO<T, ID extends Serializable> {
private final EntityManager em;
private final Class<T> entityClass;
public GenericDAO(EntityManager em) {
this.em = em;
ParameterizedType genericSuperClass = (ParameterizedType) getClass().getGenericSuperclass();
this.entityClass = (Class<T>) genericSuperClass.getActualTypeArguments()[0];
}
}
如果我扩展这个课程,一切正常。现在我想直接使用这个类(参见代码belove,CRUDBean是CRUDService的实现) - 有必要重写构造函数来获取特定的类。
@Remote(CRUDService.class)
@Stateless
public class CRUDBean<T extends EntityBase> implements CRUDService<T> {
@PersistenceContext
private EntityManager entityManager;
@Override
public long size(String whereClause, Map<String, Object> whereParameters) {
return new GenericDAO<T, Long>(entityManager).size(whereClause, whereParameters);
}
}
如何编写此类仿制服务?
答案 0 :(得分:1)
是的,您需要创建一个单独的构造函数。
您当前的构造函数假定this
是GenericDAO
的子类的实例,它使用该事实通过getClass().getGenericSuperclass().getActualTypeArguments()
为您获取类型参数。
要直接使用GenericDAO
,您应该创建一个GenericDAO
构造函数,它将实体类(无论类型T
是什么)作为参数。然后在CRUDBean.size()
或您需要实例化GenericDAO
的任何地方提供实体类。
如果您在CRUDBean
中没有可用的实际班级,则有三种选择:
CRUDBean
构造函数,它将实体类作为参数。size()
添加一个参数,该参数将实体类作为参数。GenericDAO
构造函数相同的技巧来获取它,但改为使用getGenericInterfaces()
。答案 1 :(得分:0)
我建议使用显式的“类型令牌”,而不是重用一个类。
答案 2 :(得分:0)
通常的,最简单的方法是将类的实例传递给构造函数:
public GenericDAO(EntityManager em, Class<T> entityClass) {
this.em = em;
this.entityClass = entityClass;
}
然后这样称呼:
public long size(String whereClause, Map<String, Object> whereParameters, Class<T> entityClass) {
return new GenericDAO<T, Long>(entityManager, entityClass).size(whereClause, whereParameters);
}