[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 メーリングリストの案内