2012-12-07 56 views
0

Apache Wicket-question:Wicket:ConverterLocato - 設置接口的IConverter

我想在ConverterLocator類中註冊一個IConverter。從WebApplication的類:

protected IConverterLocator newConverterLocator() { 
    ConverterLocator locator = (ConverterLocator) super.newConverterLocator(); 
    locator.set(MyInterface.class, new MyConverter());  
} 

我的問題是,MyConverter.convertTo *() - 方法是從來沒有「觸發」時的值是實現MyInterface的一類。它只適用於在ConverterLocator中註冊MyInterface的實現。

關於如何讓MyConverter轉換MyInterface的所有實現的任何建議,而不必手動註冊它們全部?

這似乎是基本的多態行爲:-)

回答

2

我認爲唯一的解決辦法是實現自己的IConverterLocator並覆蓋你的WebApplication.newConverterLocator()註冊。

這是你必須改變當前的默認實現的代碼段:

public final <C> IConverter<C> get(Class<C> c) 
{ 
    @SuppressWarnings("unchecked") 
    IConverter<C> converter = (IConverter<C>)classToConverter.get(c.getName()); 
    return converter; 
} 

在這裏看看: https://github.com/apache/wicket/blob/master/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java

0

找到了解決辦法。代碼只在啓動時運行,所以性能不應該成爲問題。訣竅是通過使用Spring ClassPathScanningCandidateComponentProvider進行類路徑掃描來查找接口的所有實現。

不是很優雅的解決方案,雖然:-)

ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true); 
provider.addIncludeFilter(new AssignableTypeFilter(MyInterface.class)); 


Set<BeanDefinition> components = provider.findCandidateComponents("org/example/package"); 
for (BeanDefinition component : components) 
{ 
    Class cls = Class.forName(component.getBeanClassName()); 
    locator.set(cls, new MyGenericConverter<MyInterface>()); 
} 

然後overrided默認ConverterLocator並添加上面構造函數的代碼。