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);
}
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");
});
setHeaderResponseDecorator(response -> {
return new ResourceAggregator(new JavaScriptFilteredIntoFooterHeaderResponse(response, "footer"));
});
wicket/ResourceAggregator.java at 8322023887d0486c725276a0090755021ba063c6 · apache/wicket
これで、ローカル環境での アプリケーション起動はできるようになりました。
コンパイルエラーはすぐに気づくのでいいんですが、振る舞いの変更だったり、推奨される実装が新たに追加は、ドキュメント読まないと気づかないので、Migration Giude は見た方がいいが教訓かなと思いました。
以上です。
コメント