0

实际上,我正在将一个应用程序从 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 定义了所有方法,如创建、读取、更新等。

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 似乎有一些规范无法实现我的实现。有谁知道这个问题或可以帮助我解决?

非常感谢,对不起我糟糕的英语......

4

1 回答 1

1

您是对的,规范中的更改使您的原始代码无法正常工作。我相信这个问题正在 CDI 1.2 中进行审查,以便恢复。基本上,CDI 1.1 的编写方式必须具有StoreManager<Person>(例如PersonStoreManager extends StoreManagerImpl<Person>)的具体实现。

于 2014-04-03T01:38:51.593 回答