[Seasar-user:15249] Re: forEach + ダイナミックバリデータでConcurrentModificationExceptionが発生。

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 8月 1日 (金) 17:00:46 JST


小林 (koichik) です.

Date:    Fri, 1 Aug 2008 08:39:29 +0900
From:    上野勝広 <[E-MAIL ADDRESS DELETED]>
To:      <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:15244] forEach + ダイナミックバリデータでConcurrentModificationExceptionが発生。

> 現在、forEach+ダイナミックバリデータで下記のようなエラーが発生し、困っています。 
(略)
>  public void validate(FacesContext context, UIComponent component, Object 
> value)
>    throws FacesException {
>   MyCustomProhibitionValidator prohibitionValidator = new 
> MyCustomProhibitionValidator();
>   MyCustomMaxByteLengthValidator maxByteLengthValidator = new 
> MyCustomMaxByteLengthValidator();
>   prohibitionValidator.setMessageId(getPatternMsg());
>   prohibitionValidator.setTarget(getTarget());
>   prohibitionValidator.setPattern(getPattern());
>   maxByteLengthValidator.setMaximum(getMaximum());
>   maxByteLengthValidator.setTarget(getTarget());
>   add(prohibitionValidator);
>   add(maxByteLengthValidator);
>   super.validate(context, component, value);
>  }
> }

validate() メソッドの中で add() を呼び出しているのと,
ページクラスの getXxxValidator() で (おそらく) 同じ
MyCustomMaxByteLengthValidator のインスタンスを
返しているのが原因ではないでしょうか.

そのために,super.validate() を呼び出している時に
別のスレッドでこの validate() が呼び出されると,
add() で ArrayList に prohibitionValidator などが
呼び出されてしまい,super.validate() で
ConcurrentModificationException が
発生しているものと思われます.

以下のドキュメントにもあるように,

http://teeda.seasar.org/ja/extension/reverse/validation.html#複数のバリデータを使用するには

ValidatorChain#add() はページクラスの 
getXxxValidator() メソッドから呼び出されることを
想定しています.
また,同じインスタンスを返さないようにしてください.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



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