エラーメッセージの表示順

SAStruts でバリデーションエラーとかの表示順についてはまる。アクションフォームで複数の public フィールドに対してアノテーションをくっつけて、バリデーションエラーを起こすと、public フィールドの順番に表示される(まぁ、これも Java の仕様的には保証されてはない気がするけど、Sun の JVM では順番どおりで出してくれるから良しとする)。

っで、そのアクションフォームに public フィールドに加えて、それらの setter/getter とか記述しちゃうと、順番がおかしくなる・・・。原因は、S2 の BeanDesc で setupPropertyDescs()、setupMethods()、setupFields() の順番に実行していく過程で setupPropertyDescs() で Class#getMethods() の順番で、先に propertyDescCache が作られてしまう・・・(というわけで public フィールドの記述した順じゃなくなる)。そんで、 SAStruts の ActionCustomizer の setupValidator でバリデータが突っ込まれているみたい。というわけで、順番が不自然になる(場合がある、という方が正しいのか)・・・。

はて、どうしたものか・・・。BeanDesc のフィール順で並び替えるとかかな(これも Java の仕様的には保証されないと思うけど、Sun の JVM だと public フィールド順になると思うから、これはこれで良しとしておく)。

requestのgetHeaderNames()

SAStruts なポートレットでは、HttpServletRequest の getHeaderNames() で null を返していたのだけど、これだと、externalbinding するときに S2 の ServletRequestHeaderMap でヌルポになってしまう。getHeaderNames() って null を返しちゃいけないのかなっと思って javadoc を見たら、このメソッドにアクセスできないときは null を返してもいいみたい。まぁ、たぶん、ほとんどすべてのサーブレットコンテナはnullを返すことはないのだろうね。というわけで、SAStrutsなポートレットしては、空のEnumerationを返すことにしよう。

LiferayでSAStrutsなポートレットをHOT deploy

PALポータルでいつも普通に HOT deploy で作っているけど、Liferay でも同様にやってみる。Tomcat 5.5 で試してみると、以下のような手順が良いかと思う。

  • Liferay を起動して、一度、HOT deploy したいポートレットの war ファイルを配備する
  • 配備後の WEB-INF/web.xml を開発環境の src/main/webapp/WEB-INF/web.xml にコピー
  • 配備後の WEB-INF/tld を開発環境の src/main/webapp/WEB-INF/tld にコピー
  • 配備後の WEB-INF/lib/util-*.jar を開発環境の src/main/webapp/WEB-INF/lib にコピー
  • 配備してあるポートレットを削除(Liferay の webapps/hogeportlet* みたいな感じのを削除)
  • Eclipse なら Tomcat プラグインとかでコンテキストの更新して配備(conf/Catalina/localhost/hogeportlet.xml を作るみたいな)
  • あとは、Liferay の Tomcat を catalina.sh jpda start みたいな感じでデバッグできるように起動(または Tomcat プラグインから Liferay の Tomcat を起動するとか)

という感じで、web.xml、tld、util-*.jar のあたりがポイントかね。たぶん、これで良いかと。