Java 重写Wicket 6中内置映射器的正确方法
Wicket 6有一个默认的复合请求映射器:SystemMapper。它包含BookmarkableMapper。我需要覆盖它,也就是说,使用我自己的FancyBookmarkableMapper 我尝试的是: 将SystemMapper类作为一个整体复制并更改以下行 添加新的书签映射器 到 但这种方式非常丑陋和脆弱,尽管它似乎有效。我在这里提到它只是为了完整 使用SystemMapper是ICompoundMapper这一事实,使用add、remove和iterator方法替换映射器: 但是,这不起作用,因为CompoundRequestMapper中实际定义的SystemMappermapRequest直接使用mappers字段,而不是通过迭代器方法 最简单的方法:Java 重写Wicket 6中内置映射器的正确方法,java,wicket,Java,Wicket,Wicket 6有一个默认的复合请求映射器:SystemMapper。它包含BookmarkableMapper。我需要覆盖它,也就是说,使用我自己的FancyBookmarkableMapper 我尝试的是: 将SystemMapper类作为一个整体复制并更改以下行 添加新的书签映射器 到 但这种方式非常丑陋和脆弱,尽管它似乎有效。我在这里提到它只是为了完整 使用SystemMapper是ICompoundMapper这一事实,使用add、remove和iterator方法替换映射器: 但是,
private SystemMapper customizeSystemMapper2() {
final SystemMapper rootRequestMapper = (SystemMapper) getRootRequestMapper();
rootRequestMapper.add(new FancyBookmarkableMapper());
return rootRequestMapper;
}
在这里,我们将映射器添加到列表的开头。它扩展了BookmarkableMapper并继承了它的getCompatibilityScore,因此它与BookmarkableMapper的分数相同,并且它在列表中的位置较早,因此它具有优先权
第4项实际上有效。唯一让我问这个问题的是,实际上,对于这种方法,两个映射器都在SystemMapper的内部列表中。是否保证以后添加的具有相同分数的我的映射器将优先于包括未来Wicket版本的映射器?最简单和正式的方法是在您的ApplicationInit方法中使用WebApplicationmountnew FancyBookmarkableMapper 明天我会在3点后检查你的问题!更新:使用
请让我们知道,如果你看到更多的改进!谢谢大家! 这个页面实际上是使用我们的mapper实现挂载的,mapper实现扩展了MountedMapper。但是,当侦听器的请求像链接单击一样处理时,Wicket会使用另一个映射器,即SystemMapper中的BookmarkableMapper。此外,我的FancyBookmarkableMapper扩展的BookmarkableMapper没有任何接受装载路径的构造函数。我很困惑。你试过我的建议了吗?我不是说页面。我在我的WebApplicationinit方法中添加了mountnew FancyBookmarkableMapper,在使用system mapper进行任何操作之前,以及在其他装载之前,它都可以工作。谢谢对于没有mountPath的映射程序使用mount,我只是有点困惑:
private SystemMapper customizeSystemMapper() {
final SystemMapper rootRequestMapper = (SystemMapper) getRootRequestMapper();
IRequestMapper originalBookmarkableMapper = null;
boolean afterBookmarkable = false;
List<IRequestMapper> mappersAfterBookmarkable = new ArrayList<>();
for (IRequestMapper mapper : rootRequestMapper) {
if (mapper.getClass() == BookmarkableMapper.class) {
if (originalBookmarkableMapper != null) {
throw new IllegalStateException("There are two BookmarkableMapper instances in the initial mappers list");
}
originalBookmarkableMapper = mapper;
afterBookmarkable = true;
} else {
if (afterBookmarkable) {
mappersAfterBookmarkable.add(mapper);
}
}
}
if (originalBookmarkableMapper == null) {
throw new IllegalStateException("There is no BookmarkableMapper in the initial mappers list");
}
for (IRequestMapper mapperToRemove : mappersAfterBookmarkable) {
rootRequestMapper.remove(mapperToRemove);
}
rootRequestMapper.remove(originalBookmarkableMapper);
rootRequestMapper.add(new FancyBookmarkableMapper());
for (IRequestMapper mapperToAdd : mappersAfterBookmarkable) {
rootRequestMapper.add(mapperToAdd);
}
return rootRequestMapper;
}
@Override
public Iterator<IRequestMapper> iterator() {
return new Iterator<IRequestMapper>() {
private Iterator<IRequestMapper> originalIterator = delegate.iterator();
@Override
public boolean hasNext() {
return originalIterator.hasNext();
}
@Override
public IRequestMapper next() {
IRequestMapper nextMapper = originalIterator.next();
if (nextMapper != null && nextMapper.getClass() == BookmarkableMapper.class) {
nextMapper = bookmarkableMapperReplacement;
}
return nextMapper;
}
@Override
public void remove() {
originalIterator.remove();
}
};
}
private SystemMapper customizeSystemMapper2() {
final SystemMapper rootRequestMapper = (SystemMapper) getRootRequestMapper();
rootRequestMapper.add(new FancyBookmarkableMapper());
return rootRequestMapper;
}