[Seasar-user:8609] Re: s2jsf の postback および S2AnywhereValidator について

cero [E-MAIL ADDRESS DELETED]
2007年 6月 23日 (土) 02:56:39 JST


せろです。

S2AnywhereValidatorの実装ですが、
ご指摘の通り、sessionを使った際の挙動に問題がありました、
すみません m(_ _)m

提案された方法でも動作すると思いますが、
もう少しspecに近い実装をすると、こんな感じになります。

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

	if (value == null)
	{
		return;
	}

	UIComponent[] targetComponents = getTargetComponents(component);
	Object[] targetValues = new Object[targetComponents.length];
	for (int i = 0; i < targetComponents.length; i++)
	{
		if (targetComponents[i] instanceof UIInput)
		{
			UIInput input = (UIInput) targetComponents[i];
			Object submittedValue = input.getSubmittedValue();

			if (submittedValue != null)
			{
				targetValues[i] = RenderUtil.getConvertedValue(context,
						input, submittedValue);
			}
			else
			{
				targetValues[i] = input.getLocalValue();
			}
		}
		else
		{
			targetValues[i] = ValueHolderUtil.getValue(targetComponents[i]);
		}
	}
	doValidate(context, component, value, targetComponents, targetValues);
}
------------------------------------------------------------

この方法だと、
convert処理が特殊な場合(一部のStringはnullと同等に扱うような変換)でも
対応できるので、良いかなと思います。

近日中にテストなどを行ない、コミットしておきます。


ご指摘、ありがとうございました m(_ _)m

それでは

> -----Original Message-----
> From: [E-MAIL ADDRESS DELETED] 
> [mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of 
> Masatoshi Hokino
> Sent: Tuesday, June 19, 2007 4:12 PM
> To: [E-MAIL ADDRESS DELETED]
> Subject: [Seasar-user:8462]s2jsf の postback および S2AnywhereValidator につ
> いて
> 
> 
> 保木野と申します。
> 
> s2jsf 1.0.x のシステムを s2jsf 1.1.2 に以降しているのですが、
> 2つ質問があります。
> 
> まず、postbackの動作についてですが、
> faces-config.xml で redirect を設定していないページでは、
> postback が正常に動作しないように見えます。
> redirect を設定していない場合は、1回目の表示から true が返ってきてしまいます。 
> 
> s2jsf1.0.xでは、ちゃんとfalseが返ってきたと思うんですが、これは仕様でしょうか?
> 
> 2つ目は、S2AnywhereValidator についてです。
> Dtoのスコープが session のときに S2AnywhereValidator を継承した Validator が
> 正しく動作しないようです。
> 
> s2jsf-exampleに含まれるAnywareCalenderValidatorを使った再現サンプルを作成しました。
> 添付のファイルに、s2-jsf-example-1.1.2.zipに含まれているjarをコピーしてください。
> 
> 再現手順は、
> 1) page1.html で正常な値を入力し、nextボタンで次ページへ移る
> 2) page2.html から prevボタンで戻る
> 3) page1.html で不正な値を入力し、 nextボタンを押す
> 3のときにバリデーションエラーが出るはずだが、
> このケースではバリデーションエラーとならずに次ページへ行ってしまう。
> 
> これを回避するために、S2AnywhereValidatorのvalidateメソッドを次のように書き換えました。
> 
>  public void validate(FacesContext context, UIComponent component,
>    Object value) throws ValidatorException {
> 
>   if (value == null) {
>    return;
>   }
> 
>   UIComponent[] targetComponents = getTargetComponents(component);
>   Object[] targetValues = new Object[targetComponents.length];
>   for (int i = 0; i < targetComponents.length; i++) {
>    targetValues[i] = null;
>    if (targetComponents[i] instanceof UIInput) {
>     UIInput input = (UIInput) targetComponents[i];
>     Object submittedValue = input.getSubmittedValue();
>     targetValues[i] = RenderUtil.getConvertedValue(context, input,
>       submittedValue);
>    }
>    if (targetValues[i] == null) {
>     targetValues[i] = ValueHolderUtil.getValue(targetComponents[i]);
>    }
>   }
>   doValidate(context, component, value, targetComponents, 
> targetValues);  }
> 
> 再現サンプル含めたexamples.jsf.validator.TestAnywareValidatorというクラスで
> 試してみましたが、意図したとおりに動いているように見えます。
> 対応方法としてあっていますでしょうか?
> 
> 
> 最後にこれはご報告になりますが、
> s2-jsf-blank-1.1.2.zip からプロジェクトを作成したところ
> java.lang.NoClassDefFoundError: 
> javax/transaction/TransactionSynchronizationRegistry
> となりました。
> s2-jsf-blank-1.1.2.zip に含まれている geronimo-jta_1.0.1B_spec-1.0.jar を
> s2-jsf-example-1.1.2.zip に含まれている geronimo-jta_1.1_spec-1.0.jar に置き換えたと
> ころ
> 正常に動作しました。
> 
> 以上、よろしくお願いします。
> 



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