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

找到了解决方案。该代码仅在启动期间运行,因此性能应该不是问题。诀窍是通过使用 springs 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 回答