Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

validation.xmlと同等のリソースバンドル取得方法

ちょっと複雑な検証ルールがあってvalidation.xmlだと記述しづらかったため、validateメソッドのオーバーライドで対応したのですが、検証ルールが2カ所に分散して保守性が悪い気がしたので思い切って全てvalidateメソッド側に記述しようと思いました。

validateメソッド側に移動するにあたってvalidation.xmlに記述したのと同等の動作をさせたかったので、depends属性の指定内容はGenericValidatorクラスメソッド群、argで指定された項目名キー等はResourceBundleクラスメソッド群で置換ができそうだということまではわかりました。
そこでできたサンプルが下記のような感じなのですが、ResouceBundleのgetBundleメソッドにstruts-config.xmlで指定してあるmessage-resourcesタグのparameter内容をそのまま使用させる(validation.xmlと同じリソースバンドルを使用する)ようにするにはどう記述すればよいのでしょうか?

〜validation.xml〜
<form name="HogeForm">
  <field property="foo" depends="date">
    <arg key="HogeForm.foo"/>
    <var>
      <var-name>datePatternStrict</var-name>
      <var-value>yyyy/MM/dd</var-value>
    </var>
  </field>
</form>

〜validateメソッドの記述〜
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
  ActionErrors errors = super.validate(mapping, request);
  // FIXME struts-config.xmlの設定からリソースバンドルを取得したい
  ResourceBundle bundle = ResourceBundle.getBundle("MessageResource");
  if (!GenericValidator.isDate(this.foo, "yyyy/MM/dd", true)) {
    errors.add("", new ActionMessage("errors.required", bundle.getString("HogeForm.foo")));
  }
  return errors;
}

1

回答

4701

閲覧

1件の回答

評価

0

その後も色々探してみた結果、ResourceBundleクラスメソッドではなくorg.apache.struts.validator.Resources#getMessageResources(HttpServletRequest)でMessageResourcesを取得してgetMessageメソッドを使うことでプレースホルダの置換も含めて実現することができました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。