gpt4 book ai didi

java - 覆盖 Wicket 6 中内置映射器的正确方法

转载 作者:行者123 更新时间:2023-12-02 13:41:12 24 4
gpt4 key购买 nike

Wicket 6 有一个默认的复合请求映射器:SystemMapper。它包含BookmarkableMapper。我需要重写它,即使用我自己的 FancyBookmarkableMapper 代替。

我尝试过的:

  1. 复制整个 SystemMapper 类并更改以下行

add(new BookmarkableMapper());

add(new FancyBookmarkableMapper());

但是这种方式在升级方面非常丑陋且脆弱(尽管它似乎有效)。我在这里提到它只是为了完整起见。

  • 利用 SystemMapperICompoundMapper 的事实,使用 add()remove()< 替换映射器iterator() 方法:

    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;
    }
  • 虽然效果也不错,但也不太好。

  • 构建 ICompoundMapper 的实现并用它装饰 SystemMapper 实例。替代内置映射器的唯一方法是尝试使用 iterator() 方法:

    @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();
    }
    };
    }
  • 但是,这不起作用,因为 SystemMapper#mapRequest() (实际上在 CompoundRequestMapper 中定义)直接使用 mappers 字段,而不是通过iterator() 方法。

  • 最简单的方法:

    private SystemMapper customizeSystemMapper2() {
    final SystemMapper rootRequestMapper = (SystemMapper) getRootRequestMapper();
    rootRequestMapper.add(new FancyBookmarkableMapper());
    return rootRequestMapper;
    }
  • 在这里,我们将映射器添加到列表的开头。它扩展了 BookmarkableMapper 并继承了 getCompatibilityScore(),因此它与 BookmarkableMapper 具有相同的分数,并且它在列表中靠前,因此它优先。

    这个项目 4 确实有效。唯一让我问这个问题的是,实际上,两个映射器都在这种方法的 SystemMapper 的内部列表中。是否保证我的映射器(后来添加并具有相同的分数)将优先(包括 future 的 Wicket 版本)?

    最佳答案

    最简单(也是官方)的方法是在 YourApplication#init() 方法中使用 WebApplication#mount(new FancyBookmarkableMapper ()

    明天我会在 3) 中查看您关心的问题! 更新:用https://git1-us-west.apache.org/repos/asf?p=wicket.git;a=commitdiff;h=0eb63480;hp=5821157738ac43a09232a2aeb0fa2ff808340f4d改进它如果您看到更多改进,请告诉我们!谢谢!

    关于java - 覆盖 Wicket 6 中内置映射器的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42737539/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com