[Seasar-user:2413] Re: [S2JSF] 他の入力値を参照するvalidator

O.K.U. oku
2005年 7月 22日 (金) 14:32:15 JST


O.K.U.です。

>instance属性をrequestにするとどうですか。

少なくともインスタンスはリクエスト毎に違っているようですが、
setter はセッションにつき1回しか呼ばれないようです。
後述するようなプログラムで検証してみました。

(1) Jboss起動。

(2) 該当formのあるページを表示
  ここで、setterが起動される。validatorは起動されない。
  ログ|setAnotherId: [E-MAIL ADDRESS DELETED],s=registForm:password

(3) 該当formにデータを入力し、submit ボタンをクリック。
  validatorが起動される。インスタンスはsetterが呼ばれた時と別物。setterは起動されない。
  よって、staticなエリアに保存しておいたものは参照できるが通常のデータメンバーは null 
  ログ|validate: this=[E-MAIL ADDRESS DELETED],id=null,s_id=registForm:password

(4) 再度(3)を実行
  インスタンスは(3)とは別のものになっている。setterは起動されない。
  ログ|validate: this=[E-MAIL ADDRESS DELETED],id=null,s_id=registForm:password

(5) 画面はそのままでJbossを再起動
  setter は起動されない。

(6) そのまま再度、formにデータを入力し、submit ボタンをクリック。
  setterは起動されてない。Jboss再起動によってstaticなエリアもクリアされているので、いずれも null
  ログ|validate: this=[E-MAIL ADDRESS DELETED],id=null,s_id=null


【検証用プログラム】

public class EqualsValidator implements Validator {
    private static Log logger = LogFactory.getLog(EqualsValidator.class);

    private String anotherId;
    static private String s_anotherId;

    public void setAnotherId(String s){
        logger.debug("setAnotherId: this=" + this + ",s=" + s);
        anotherId = s;
        s_anotherId = s;
    }

    public void validate(FacesContext context,
                         UIComponent component,
                         Object value) {

        logger.debug("validate: this=" + this + ",id=" + anotherId + ",s_id=" + s_anotherId);
    }
}

【dicon の定義】
<component name="equalsValidator" class="xxx.validator.EqualsValidator" instance="request">
   <property name="anotherId">"registForm:password"</property>
</component>




Seasar-user メーリングリストの案内