[Seasar-user:6101] Re: [S2Struts] プリミティブ等のプロパティを含むDTOの検証の動作について
Nishiwaki Kiyoyuki
[E-MAIL ADDRESS DELETED]
2007年 2月 9日 (金) 19:32:23 JST
永島さま。
西腋と申します。
少々古いスレッドですが、関連したことですので過去のメールの続きで書かせていた
だきます。
以前、検証対象になっているDTOに java.sql.Date が入っている場合
例外が発生しましたので対応していただいたのですが、
同じような現象が、java.math.BigDecimal でも起こってしまいました。
デバッグして確認したところ
根本の原因としては、BigDecimal にはsetScaleメソッドが存在するのですが
getScaleメソッドが存在しないため、実際に検証しようとしたときに
getScaleメソッドが見つからないと例外を起こしていました。
org.seasar.struts.validator.factory.AbstractValidatorAnnotationHandler
の registerFields(Form, Field, BeanDesc) には
hasMethodForValidationメソッドを使用して、指定のプロパティが検証対象であるか
否かを
判断しているところがあります。
そこで、
hasMethodForValidationメソッドでの判断で、今のところ
propDesc.hasWriteMethod()
の値のみで判断していますので、
propDesc.hasReadMethod()
の値も使用して判断してみては、と思うのですが、いかがでしょうか。
実際のところ、検証のアノテーションに noValidate をつけて検証が追加されるのを
回避しているので、問題にはなっていないのですが。
よろしくお願いいたします。
> -----Original Message-----
> From: [E-MAIL ADDRESS DELETED]
> [mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of
> Katsuhiko Nagashima
> Sent: Wednesday, December 27, 2006 1:10 AM
> To: [E-MAIL ADDRESS DELETED]
> Subject: [Seasar-user:5618] Re:[S2Struts]
> プリミティブ等のプロパティを含むDTOの検証の動作について
>
> 永島です。
>
> > DTOに java.sql.Date (java.util.Date では無いです。DBからのデータを出力用
に記
> > 述したものです)
> > のプロパティがある場合、この型検証の自動付加によって java.sql.Date の
hours
> > プロパティなどにinteger の検証が付加されます。
> > しかし、J2SE 1.4 などのJavaDocを見ると、java.sql.Date#getHours() を呼ぶ
と
> > IllegalArgumentException が発生するととなっており、
> > 最終的には org.apache.commons.validator.util.ValidatorUtils で
> > java.lang.reflect.InvocationTargetException が発生したとダンプされます。
>
> java.sql.Dateの各メソッドに対して自動的に型検証を付加しないように修正しま
した。
>
> ご指摘ありがとうございます。
>
>
> 06/12/25 に Nishiwaki
> Kiyoyuki<[E-MAIL ADDRESS DELETED]> さんは書きました:
> > 西腋です。
> >
> > > 現在、DTOの各プロパティに値を入れる前に検証を行う機能は提供しておりま
せ
> > ん。
> > > 一時提供する予定(していた)でしたが、少し問題があったので廃止しまし
た。
> > > ですので、ご指摘の通り型検証の自動付加は有効に利用することはできないか
もし
> > れません。。。
> >
> > 了解です。
> > 画面から入力用のプロパティは基本的に String にしてアノテーションを記述し
て検
> > 証するようにします。
> > ありがとうございました。
> >
> >
> >
> > あと、
> > この記事を検索等で引っ掛けた人向けの情報として
> >
> > DTOに java.sql.Date (java.util.Date では無いです。DBからのデータを出力用
に記
> > 述したものです)
> > のプロパティがある場合、この型検証の自動付加によって java.sql.Date の
hours
> > プロパティなどにinteger の検証が付加されます。
> > しかし、J2SE 1.4 などのJavaDocを見ると、java.sql.Date#getHours() を呼ぶ
と
> > IllegalArgumentException が発生するととなっており、
> > 最終的には org.apache.commons.validator.util.ValidatorUtils で
> > java.lang.reflect.InvocationTargetException が発生したとダンプされます。
> >
> > ただ、
> > java.sql.Date が java.util.Date の派生なので、DTOのプロパティは
> > java.util.Date にすることで正常に動作するので
> > いまのところ問題なく使用できています。
> >
> >
> > > -----Original Message-----
> > > From: [E-MAIL ADDRESS DELETED]
> > > [mailto:[E-MAIL ADDRESS DELETED]] On Behalf Of Katsuhiko
> > > Nagashima
> > > Sent: Friday, December 22, 2006 10:34 PM
> > > To: [E-MAIL ADDRESS DELETED]
> > > Subject: [Seasar-user:5598] Re:[S2Struts]
> > > プリミティブ等のプロパティを含むDTOの検証の動作について
> > >
> > > 永島です。
> > >
> > > > この機能は、画面からの入力値を検証する以外のための機能なのでしょう
か?
> > > > それとも、DTOの各プロパティに値を入れる前に検証を行うための設定など
があ
> > るの
> > > > でしょうか?
> > >
> > > 現在、DTOの各プロパティに値を入れる前に検証を行う機能は提供しておりま
せ
> > ん。
> > > 一時提供する予定(していた)でしたが、少し問題があったので廃止しまし
た。
> > > ですので、ご指摘の通り型検証の自動付加は有効に利用することはできないか
もし
> > れません。。。
> > >
> > > 以上です。
> > >
> > > 06/12/21 に Nishiwaki
> > > Kiyoyuki<[E-MAIL ADDRESS DELETED]> さんは書きました:
> > > > 西腋と申します。
> > > > 立続けで申し訳ありません。
> > > >
> > > > S2Struts 1.2.7 を使用して入力値の検証(strutsとcommons-validatorで)
を
> > 行って
> > > > いるのですが
> > > > DTOに以下のプリミティブ・クラスのプロパティが宣言されていると
> > > > 自動的にそれぞれのプロパティに検証(validator-rules.xml に宣言されて
いる
> > byte
> > > > 等々)が付加されます。
> > > > byte、double、float、int、long、short
> > > > Byte、Double、Float、Integer、Long、Short
> > > > java.util.Date、java.sql.Timestamp
> > > >
> > > > ソースを見ますと、
> > > >
> > >
> org.seasar.struts.validator.factory.AbstractValidatorAnnotationHandl
> > > er
> > > > #getAu
> > > > toTypeValidatorName(PropertyDesc)
> > > > にて、特定のプリミティブとクラスに対して、特定の検証
> > (validator-rules.xml に
> > > > 宣言されている検証パターン)を付加しており、
> > > > DTOが検証対象になっている場合、上記のプリミティブ・クラスのプロパ
ティに
> > も自
> > > > 動的に検証が行われています。
> > > >
> > > > ここで、一つ確認させていただきたいのですが、
> > > > 実際に検証を行う org.apache.struts.validator.FieldChecks のメソッド
が実
> > 行さ
> > > > れる際には
> > > > 第一引数にわたってくるDTO(S2Strutsの場合、
SerializeBeanValidatorFormで
> > ラッ
> > > > プされているようですが)には
> > > > すで値が設定されているため、上記のプリミティブ・クラスのプロパティに
対し
> > ても
> > > > 値がすでに格納されています。
> > > > この際、画面で入力された文字列が各プリミティブ・クラスに変換できない
場
> > 合、デ
> > > > フォルト値での初期化や、例外の発生となるため
> > > > 自動的に付加されている検証が有意義に使用できません。
> > > >
> > > > この機能は、画面からの入力値を検証する以外のための機能なのでしょう
か?
> > > > それとも、DTOの各プロパティに値を入れる前に検証を行うための設定など
があ
> > るの
> > > > でしょうか?
> > > >
> > > > よろしくお願いいたします。
> > > >
> > > >
> > > > 添付していますプロジェクトは
> > > > DTOにStringとbyteのプロパティがあり、
> > > > Stringのプロパティには、アノテーションでbyteの検証、
> > > > byteのプロパティには、上記の機能で検証がかかるようになっているサンプ
ルで
> > す。
> > > > S2Struts 1.2.7 の配布パッケージのJARを追加したら動くと思います。
> > > >
> > > >
> > > > _______________________________________________
> > > > Seasar-user mailing list
> > > > [E-MAIL ADDRESS DELETED]
> > > > https://ml.seasar.org/mailman/listinfo/seasar-user
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> > > --
> > > Katsuhiko Nagashima
> > > _______________________________________________
> > > Seasar-user mailing list
> > > [E-MAIL ADDRESS DELETED]
> > > https://ml.seasar.org/mailman/listinfo/seasar-user
> >
> >
> > _______________________________________________
> > Seasar-user mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/seasar-user
> >
> >
> >
> >
>
>
> --
> Katsuhiko Nagashima
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
Seasar-user メーリングリストの案内