实际上,我正在将一个应用程序从javaee6迁移到javaee7,它有一些带有一些CDI组件和所有业务逻辑的ejb模块。
一般来说,我有一个用实体制作CRUD的界面:
public interface StoreManager<T> {
T create(T entity) throws SystemException;
}
这样的实现:
public class StoreManagerImpl extends AbstractManager<Object> implements StoreManager<Object> {
@PersistenceContext(unitName="PersistUnit")
private EntityManager em;
private void setEntityManager(EntityManager em) {
this.em = em;
}
@Override
protected EntityManager getEntityManager() {
return em;
}
@Produces @Generator
public StoreManager create() {
StoreManagerImpl smImpl = new StoreManagerImpl();
smImpl.setEntityManager(em);
return smImpl;
}
}
抽象类AbstractManager是定义所有方法的地方,如create,read,update等。
public abstract class AbstractManager<T> {
public AbstractManager() {
}
protected abstract EntityManager getEntityManager();
public <P> P crear(P entity, Class<?> clase) throws SystemException {
try {
getEntityManager().persist(entity);
getEntityManager().flush();
getEntityManager().refresh(entity);
} catch (EntityExistsException ex) {
throw new EntityExistsException("El registro ya existe en la base de datos.");
} catch (EJBException ex) {
throw new SystemException("El registro no pudo ser guardado.");
} catch (Exception ex) {
ex.printStackTrace();
throw new SystemException("El registro no pudo ser guardado.");
}
return entity;
}
}
我的@Generator是一个Java注释,它将为服务提供一种方法来调用将实体通过泛型传递到字段级别的操作。那就是:
@Inject
@Generator
private StoreManager<Person> storeManager;
...
..
storeManager.create(person);
....
使用glassfish 3和javaee7一切正常,但javaee7似乎有一些规范无法实现我的实现。有谁知道这个问题还是可以帮我解决?
非常感谢 抱歉我的英语很差.........
答案 0 :(得分:1)
你是对的,规范发生了变化,导致原始代码无效。我相信CDI 1.2中正在审查这个问题,以便予以恢复。基本上,编写CDI 1.1的方式必须具有StoreManager<Person>
的具体实现(例如PersonStoreManager extends StoreManagerImpl<Person>
)。