Wicket 7 の アプリケーションを Wicket 8 に upgrade した


5月末に、 Wicket 8 が リリースされたので、Wicket 7 で 書いていたアプリケーションの Version Up を実施しました。
Version Up 時に実施したことを記載します。


以前 Wicket の version

以前使用していた、Wicket の version は、7.8.0 で、これを8.0.0 に upgrade しました。

Migration 時に実施したこと


NoVersionMapper でコンパイルエラー

Url の Version 番号は、NoVersionMapper という MountMappter の継承クラスを作成すると、削除することができます。
Wicket 7 ではコンパイルが通っていたこのクラスで、以下コンパイルエラーが発生しました。

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] PageResourceMounter.java:[7,46] シンボルを見つけられません
  シンボル:   クラス BookmarkableListenerInterfaceRequestHandler
  場所: パッケージ org.apache.wicket.core.request.handler
[ERROR] PageResourceMounter.java:[8,46] シンボルを見つけられません
  シンボル:   クラス ListenerInterfaceRequestHandler
  場所: パッケージ org.apache.wicket.core.request.handler
[INFO] 2 errors 

wicket - delete version number in url - Stack Overflow に、Wicket 8 で動く、NoVersionMapper の記載があり、この実装を拝借しました。

   public class NoVersionMapper extends MountedMapper {
        public NoVersionMapper(final Class pageClass) {
            this("/", pageClass);
        }

        public NoVersionMapper(String mountPath, final Class pageClass) {
            super(mountPath, pageClass, new PageParametersEncoder());
        }

        @Override
        protected void encodePageComponentInfo(Url url, PageComponentInfo info) {
            //Does nothing
        }

        @Override
        public Url mapHandler(IRequestHandler requestHandler) {
            if (requestHandler instanceof ListenerRequestHandler || requestHandler instanceof BookmarkableListenerRequestHandler) {
                return null;
            } else {
                return super.mapHandler(requestHandler);
            }
        }
    }

メソッドの戻り値が Lamba型を返す兼ね合いでのエラー

[ERROR] 戻り値の型org.apache.wicket.util.IProvider<org.apache.wicket.request.IExceptionMapper>はjava.util.function.Supplier<org.apache.wicket.request.IExceptionMapper>と互換性がありません

これは、Application#getExceptionMapperProvider() の 戻り値が、IProvider ではなく、Supplierになったため、発生していました。
以下の通り、getExceptionMapperProvider の記載を変更しました。

  /**
     * getExceptionMapperProvider
     *
     * @return
     */
    @Override
    public Supplier<IExceptionMapper> getExceptionMapperProvider() {
        return () -> new ApplicationExceptionMapper();
    }

元々、() -> new ApplicationExceptionMapper(); と記載していたので、戻り値の型変更だけで済みました。


AbstractMarkupFilter の 継承クラスでのエラー

自前で、Wicketのコンポーネント追加先指定にHTMLのID属性を利用可能にするライブラリを作成してみた - まどぎわBLOG を参考に、HtmlTagIdentifier というクラスを作成していたのですが、コンパイルエラーが発生しました。

[ERROR] HtmlTagIdentifier.java:[45,34] シンボルを見つけられません
[ERROR] シンボル:   変数 FragmentResolver
[ERROR] シンボル:   変数 MarkupInheritanceResolver

エラー発生箇所は、以下のような記述をしていました。
Wicket のタグ名をHashSet に設定しています。

    /**
     * List of well known wicket tag names
     */
    private static final Set<String> WELL_KNOWN_TAG_NAMES = new HashSet<>();

    static {
        WELL_KNOWN_TAG_NAMES.add(Border.BORDER);
        WELL_KNOWN_TAG_NAMES.add(Border.BODY);
        WELL_KNOWN_TAG_NAMES.add(AutoLabelTextResolver.LABEL);
        WELL_KNOWN_TAG_NAMES.add(Panel.PANEL);
        WELL_KNOWN_TAG_NAMES.add(EnclosureHandler.ENCLOSURE);
        WELL_KNOWN_TAG_NAMES.add(WicketLinkTagHandler.LINK);
        WELL_KNOWN_TAG_NAMES.add(WicketRemoveTagHandler.REMOVE);
        WELL_KNOWN_TAG_NAMES.add(Fragment.RENDER);
        WELL_KNOWN_TAG_NAMES.add(HtmlHeaderResolver.HEAD);
        WELL_KNOWN_TAG_NAMES.add(HtmlHeaderResolver.HEADER_ITEMS);
        WELL_KNOWN_TAG_NAMES.add(MarkupInheritanceResolver.CHILD);
        WELL_KNOWN_TAG_NAMES.add(MarkupInheritanceResolver.EXTEND);
        WELL_KNOWN_TAG_NAMES.add(WicketContainerResolver.CONTAINER);
        WELL_KNOWN_TAG_NAMES.add(WicketMessageResolver.MESSAGE);
    }

この実装を、wicket/WicketTagIdentifier.java at master · apache/wicket を参考に以下のように書き換えました。

   /**
     * List of well known wicket tag names
     */
    private static final Set<String> WELL_KNOWN_TAG_NAMES = new HashSet<>();

    static {
        WELL_KNOWN_TAG_NAMES.add(Border.BORDER);    
        WELL_KNOWN_TAG_NAMES.add(Border.BODY);
        WELL_KNOWN_TAG_NAMES.add(AutoLabelTextResolver.LABEL);
        WELL_KNOWN_TAG_NAMES.add(Panel.PANEL);
        WELL_KNOWN_TAG_NAMES.add(EnclosureHandler.ENCLOSURE);
        WELL_KNOWN_TAG_NAMES.add(WicketLinkTagHandler.LINK);
        WELL_KNOWN_TAG_NAMES.add(WicketRemoveTagHandler.REMOVE);
        WELL_KNOWN_TAG_NAMES.add(WicketTagIdentifier.FRAGMENT);
        WELL_KNOWN_TAG_NAMES.add(HtmlHeaderResolver.HEAD);
        WELL_KNOWN_TAG_NAMES.add(HtmlHeaderResolver.HEADER_ITEMS);
        WELL_KNOWN_TAG_NAMES.add(WicketTagIdentifier.CHILD);
        WELL_KNOWN_TAG_NAMES.add(WicketTagIdentifier.EXTEND);
        WELL_KNOWN_TAG_NAMES.add(WicketContainerResolver.CONTAINER);
        WELL_KNOWN_TAG_NAMES.add(WicketMessageResolver.MESSAGE);
    }
コンパイルエラーになっていたクラスは削除され、定数は、WicketTagIdentifier に移動されています。

ResourceAggregator で、IHeaderResponse の実装クラスを Wrap する

Migration to Wicket 8.0 - Apache Wicket - Apache Software Foundation に、ResourceAggregator の記述があります。

Wicket 7.x.x では、以下の記述だったのが、

setHeaderResponseDecorator(response -> {
            return new JavaScriptFilteredIntoFooterHeaderResponse(response, "footer");
});
Wicket 8.0.0 では、ResourceAggregator で Wrap するのが推奨されているようです。
setHeaderResponseDecorator(response -> {
            return new ResourceAggregator(new JavaScriptFilteredIntoFooterHeaderResponse(response, "footer"));
});
実装を確認する限りは、domReady スクリプトをまとめる機能があったり、JavaScirpt の書き出しのパフォーマンス、実行速度に寄与しそうに思います。
wicket/ResourceAggregator.java at 8322023887d0486c725276a0090755021ba063c6 · apache/wicket

これで、ローカル環境での アプリケーション起動はできるようになりました。
コンパイルエラーはすぐに気づくのでいいんですが、振る舞いの変更だったり、推奨される実装が新たに追加は、ドキュメント読まないと気づかないので、Migration Giude は見た方がいいが教訓かなと思いました。
以上です。

コメント