2013-06-19 21 views
3

我試圖實現某種生產者工廠模式。
是否有可能在注入派生類型的同時觸發基類型的生產者方法?CDI - 繼承:基類型的觸發器生產者

假設以下接口:

interface Service 
interface AService extends Service 

我要觸發這個製片人:

@Produces 
Service factory() 

在此注入點:

@Inject 
AService srv; 

的目的是爲了有一個生產工廠通過添加一個標記接口(在這種情況下爲服務)不同種類的服務。

謝謝你幫我


更新:

我試圖LightGuards水溶液,並添加@Typed到AService實現:

@Typed(Service.class) 
class AServiceImplemenation implements AService 

不幸的是,我得到一個不滿意的依賴錯誤。 CDI不會爲AService注入點調用Service生產者。當然,這對於類型原因是有意義的。但是有沒有辦法強制調用Service製作人?

回答

0

如果您只有超級類型的生產者,並且使得AService類型沒有無參數ctor(或者使用@Inject註釋),或者在CDI 1.1中是@Typed@Vetoed,那麼您可以返回生產者的任何子類Service

+0

不幸的是我得到了一個_unsatisfied dependencies_ 我標記AService與'@Typed(Service.class)的implemtation' 我還擔任一個附加限定詞用於注射點和生產者。但我仍然得到_unsatisfied依賴關係_ – Robotregent

+0

這很奇怪。哪臺服務器?這些班級是否都在同一個戰爭/罐子裏? – LightGuard

+0

我正在使用jboss 7.1.1。所有的課程都在一場戰爭中。 周圍的其他方法('@注入Service'和AService製片人)工作正常。確切位置在哪裏我應該把'@ Typed'? – Robotregent

0

CDI不允許生產者生產超,它不會只是找到合適的生產商爲您

@Inject 
AService srv; 

我面臨同樣的問題,我的解決辦法是:

public class ServiceProxy<T> { 
    private final T service; 
    public ServiceProxy(T service) { 
     this.service = service; 
    } 
    public T get() { 
     return service; 
    } 
} 

interface AService 
//something 

@Produces 
@SomeQualifier 
ServiceProxy factory(InjectionPoint ip) { 
    Class<?> clazz = (Class<?>) ((ParameterizedType))ip.getType()).getActualTypeArguments()[0]; 
    //now we know actual service class and can produce one impl 
} 

@Inject 
@SomeQualifier 
ServiceProxy<AService> srv;