我在Wildfly 8.2.1 Final中運行Weld 2.2.6 Final。如何在CDI/Weld中解決子類型和泛型?
鑑於
@Entity
public class Fruit{ ... }
@Entity
public class Apple extends Fruit{ ... }
public interface Repository<T extends Identifiable> { ... }
public interface Identifiable { String getId(); }
和
@ApplicationScoped
public class FruitCDIDelegateRepository implements Repository<Fruit>, SearchableRepository<Fruit> { @EJB private FruitRepository repo; }
@Stateless
@LocalBean
@Typed(FruitRepository.class)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class FruitRepository extends PersistenceRepository<Fruit> implements SearchableRepository<Fruit, FruitCriteria> {
最後的兩個庫是一個結構直出書 連續型企業發展在Java中由安德魯·李Rubinger和 Aslak Knidsen的。這是一種解決方法,可幫助EJB和CDI一起工作 。在這本書中,他們寫
這是EJB到@Typed特定類型的,以避免資源庫下 CDI被拾起由於CDI EJB 相互作用的限制/錯誤。 EJB Beans總是被解析爲Repository,這意味着實現Repository接口的兩個EJB都會響應 InjectionPoint @Inject Repository並使InjectionPoint 不明確。
作爲WorkAround,我們將可在Type系統中使用的CDI bean 中具有事務屬性的EJB進行封裝。 EJB將被視爲一個內部的實現細節 。 ConferenceCDIDelegateRepository 提供的CDI類型是真正的Repository api。
其他類在這種情況下應該忽略不計。
如果我不能夠申報
@Inject
Repository<Apple> repository;
一類
並獲得FruitRepository
(CDIDelegate
樣)?類似的情況
@Inject
Repository<Fruit> repository;
在相同的環境中產生期望的對象。
爲什麼不能@Inject FruitRepository fruitRepository?你可以注入CDI <-> EJB – jklee
嗯。我今天環繞太多了嗎?我必須清理我的頭,然後回到你身邊。目前,我必須說,看起來情況會如此,並且你的建議已經出現。關閉清理我的頭... – Mats