2010-11-18 25 views
2

我有一個對象,在Spring中注入到我的類中(如果你在意的話,可以使用JdbcCursorItemReader)。如何擁有一個Spring接口的動態代理?

它實現了5個接口,其中兩個我關心(ItemReader,ItemStream)。如果我在我的類代碼到一個或另一個,彈簧動態代理才能正確注射,我可以調用它的方法

private ItemReader blah; 
public void setItemReader(blah) { this.blah = blah }; 

酷,按預期工作。我還可以將其轉換爲ItemStream,如果我想要做的基礎上,ItemStream接口的東西:

((ItemStream))blah.close(); 

酷,這讓我既級別的接入方式。不過,我不是一個喜歡投射的人,而且知道在哪裏必須成爲更好的春季魔術。我想到的辦法是作一個結合了一個接口:

public interface IStreamingItemReader<T> extends ItemReader<T>, ItemStream { 
} 

這讓我的代碼同時使用......但代理注入預見的失敗。

無法將屬性值轉換 類型[$ Proxy0實施 org.springframework.beans.factory.InitializingBean接口,org.springframework.batch.item.ItemReader,org.springframework.batch.item.ItemStream,組織.springframework.aop.scope.ScopedObject,org.springframework.aop.framework.AopInfrastructureBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] 所需的類型 [blah.IStreamingItemReader] for property 'itemReader';嵌套0​​例外是 java.lang.IllegalArgumentException異常: 無法將類型的價值[$ Proxy0 實施 org.springframework.beans.factory.InitializingBean接口,org.springframework.batch.item.ItemReader,org.springframework.batch.item .ItemStream,org.springframework.aop.scope.ScopedObject,org.springframework.aop.framework.AopInfrastructureBean,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [blah.IStreamingItemReader ]爲 屬性'itemReader':無匹配 編輯或轉換策略找到

,進行了我的眼睛的部分是 不匹配編輯或轉換戰略發現

有沒有辦法教春天,當它看到一個JdbcCursorItemReader,做出IStreamingItemReader的代理?

我知道我可以用CGLIB和基於類的代理解決這個問題......但如果我能保持這個作爲一個動態接口代理,我會更開心......

回答

1

選項1

private ItemReader blah; 
private ItemStream blubb; 
public void setItemReader(blah) { this.blah = blah }; 
public void setItemStream(blubb) { this.blubb = blubb }; 

選項2

class ItemAccessor { 
private ItemReader reader; 
private ItemStream stream; 
// Setter & co ... 
} 

然後:

private ItemAccessor accessor; 

accessor.getReader().read(); 
accessor.getStream().stream(); 
3

簡單的方法:如果可能的話,讓你的實現類實現您的聯合接口,而不是兩個單獨的接口。

不太清楚的方式,但不引入addtional類(需要泛型):

public interface A { } 

public interface B { } 

public class C implements A, B { } 

public class D { 
    private A a; 
    private B b; 

    public <T extends A & B> void setObject(T o) { 
     this.a = o; 
     this.b = o; 
    } 

    public static void main(String[] args) { 
     D d = new D(); 
     d.setObject(new C()); 
    } 
} 
1

然而,隨着仿製藥的另一種選擇(主要是作爲一種理論上的做法),不需要重複場,但需要持有對象:

class ReaderStreamHolder<T extends ItemReader & ItemStream> { 
    private final T target; 
    public ReaderStreamHolder(T target) { 
     this.target = target; 
    } 
    public T get() { 
     return target; 
    } 
} 

private ReaderStreamHolder<?> blah; 
public <T extends ItemReader & ItemStream> void setItemReader(T target) { 
    this.blah = new ReaderStreamHolder<T>(target) 
}; 

blah.get().close(); 
相關問題