2017-01-04 40 views
0

我在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; 
一類

並獲得FruitRepositoryCDIDelegate樣)?類似的情況

@Inject 
Repository<Fruit> repository; 

在相同的環境中產生期望的對象。

+1

爲什麼不能@Inject FruitRepository fruitRepository?你可以注入CDI <-> EJB – jklee

+0

嗯。我今天環繞太多了嗎?我必須清理我的頭,然後回到你身邊。目前,我必須說,看起來情況會如此,並且你的建議已經出現。關閉清理我的頭... – Mats

回答

1

您可以注入@Statless存儲庫而不包裝。

@RequestScoped 
public class Service { 

    @Inject 
    FruitRepository fruitRepository; 

    public void saveFruit(Fruit fruit){ 
     fruitRepository.save(fuit); 
    } 

} 
+0

感謝您設置我的直線。我花了太多週轉泛型類型參數,太聰明(不是第一次)。我絕對應該在幾個小時前見過。 「掛我的頭」 – Mats

+1

不客氣 – jklee