Java 重写Wicket 6中内置映射器的正确方法

Java 重写Wicket 6中内置映射器的正确方法,java,wicket,Java,Wicket,Wicket 6有一个默认的复合请求映射器:SystemMapper。它包含BookmarkableMapper。我需要覆盖它,也就是说,使用我自己的FancyBookmarkableMapper 我尝试的是: 将SystemMapper类作为一个整体复制并更改以下行 添加新的书签映射器 到 但这种方式非常丑陋和脆弱,尽管它似乎有效。我在这里提到它只是为了完整 使用SystemMapper是ICompoundMapper这一事实,使用add、remove和iterator方法替换映射器: 但是,

Wicket 6有一个默认的复合请求映射器:SystemMapper。它包含BookmarkableMapper。我需要覆盖它,也就是说,使用我自己的FancyBookmarkableMapper

我尝试的是:

将SystemMapper类作为一个整体复制并更改以下行 添加新的书签映射器

但这种方式非常丑陋和脆弱,尽管它似乎有效。我在这里提到它只是为了完整

使用SystemMapper是ICompoundMapper这一事实,使用add、remove和iterator方法替换映射器:

但是,这不起作用,因为CompoundRequestMapper中实际定义的SystemMappermapRequest直接使用mappers字段,而不是通过迭代器方法

最简单的方法:

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;
}