0

Apache Wicket-質問:

ConverterLocatorクラスにIConverterを登録しようとしています。WebApplicationクラスから:

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

私の問題は、値がMyInterfaceを実装するクラスである場合、MyConverter.convertTo *()-メソッドが「トリガー」されないことです。これは、ConverterLocatorにMyInterfaceの実装を登録している場合にのみ機能します。

MyConverterにMyInterfaceのすべての実装を手動で登録せずに変換させる方法についての提案はありますか?

これは基本的なポリモーフィックな振る舞いのようです:-)

4

2 に答える 2

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

于 2012-12-07T13:22:03.470 に答える
0

解決策を見つけました。コードは起動時にのみ実行されるため、パフォーマンスは問題になりません。秘訣は、スプリング 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>());
}

次に、デフォルトの ConverterLocator をオーバーライドし、上記のコードをコンストラクターに追加しました。

于 2012-12-07T13:41:45.773 に答える