0

実際、いくつかの CDI コンポーネントとすべてのビジネス ロジックを備えた ejb モジュールを持つ javaee6 から javaee7 にアプリケーションを移行しています。

一般に、エンティティで 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 に答える