読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

struts-2.3.12はドロップインリプレース不可

Struts2

いつの間にsturts-2.3.12がリリースされてました。


いつものようにドロップインリプレースだと決めつけて、何も考えずにアプリを実行したら、エラーで動かない。
何じゃ?


というわけで調べてみると、Struts2のカスタムタグの、基本属性の一つである"required"の名前が"requiredLabel"に変更されたようです。
当該箇所を一律に修正したら、動作するようになりました。


リリースノートにもその旨記載されております。
https://cwiki.apache.org/WW/version-notes-2312.html

ところで、

このようなケースでは、通常ならば旧来のAPI互換性はDeprecated指定で残しておくはずです。
メンテナンスリリースならば特に。


何故今回はその措置すら取られなかったのだろうか。
というわけで、理由を調べてみました。


当該のコミットはこちらでございます。
https://github.com/apache/struts2/commit/0c00c11d0be52e47fcf7a03cf4d580be59fad7fb
綺麗サッパリ旧来の互換性が切られております。


コミットコメントには[WW-3908]とあるので、そのチケットを参照。
https://issues.apache.org/jira/browse/WW-3908


そこを見る限り、FreeMarkerにおいてinputタグのrequired属性がセットできなくて困るという苦情に対応したことが理由のようです。
しかしなぜ属性名の変更が必要なのか…?


更に深くへ

表向きの理由はわかりましたが、互換性を切った理由はわかりません。
なのでチェンジセットを詳しく見ていきます。
https://fisheye6.atlassian.com/changelog/struts2?cs=1434580


するとヒントらしきものを発見。
https://fisheye6.atlassian.com/browse/struts2/trunk/core/src/test/resources/org/apache/struts2/views/freemarker/dynaAttributes.ftl?hb=true


要するに、FreeMarkerのタグでは既にrequiredという属性名を別の意味で使ってしまっており、新規に追加する属性はrequiredLabelという名前にするしかなかった。
一方で、FreeMarkerとJSPタグの両者で同一の使い勝手を実現するために、タグ名や属性名は一致させておくというポリシーがあります。

従って、JSPタグ側のrequired属性の名前を変えざるを得なかったというのが真相のようです。