素敵なサムシングを独断と偏見で一方的に紹介するブログ(´・ω・`)

IT

【Play Framework2.7】自作のBeanValidatorのエラーメッセージをscalaテンプレートから取得出来ない場合の原因と対処方法【ConstraintValidator】

投稿日:

スポンサーリンク

336×280




scalaテンプレートでバリデーションエラーを取ろうとするとエラーが発生する

とある案件にてPlayFramework2.7でWebシステムを開発している際に、バリデーションエラーを画面に表示しようと公式のように実装していたところ、以下のようなエラーが発生しました。

ログを見ただけではちょっとエラーがまだ特定出来ませんね。

まずはデバッグでソースを追いながら原因を特定して対応していこうと思います

手順

前提

今回は以下のような一般的な独自アノテーションによるバリデーションを行おうと思っています。

インタフェース

実装クラス

Formモデル

login.scala.html

HTMLについては今回の必要な部分だけ抜粋しておきます。

org.springframework.beans.AbstractNestablePropertyAccessorでエラー

デバッグでソースを追っていくと、怪しい部分がありました。

>org.springframework.beans.AbstractNestablePropertyAccessor.javaの620行目辺りのPropertyHandler ph = getLocalPropertyHandler(actualName);にてnullが帰って来ておりそのあとのハンドリングでthrow new NotReadablePropertyException(getRootClass(), this.nestedPath + propertyName);とされています。

getLocalPropertyHandler

では、getLocalPropertyHandlerメソッドでは何をやっているのでしょうか。

ざっくり言うと、LoginFormModel.javaに定義されているフィールド名をmap形式で持っており、引数で渡って来たpropertyNameの存在をチェックしていますね。

今回は、フィールドは定義せずgetterにアノテーションを付与してバリデーションを実現しています。

実際カスタムBeanValidator自体は正常に動いているので、そのあとのエラーメッセージのバインディングの部分でメソッドに対するBeanValidatorをサポートしていないようですね。

フィールドを定義する事で回避可能

取り急ぎ原因は分かりました。

解決するには、以下のように同名のフィールドを定義する事で正常に動くようになりました。

loginCheckフィールド自体はフォームからは飛んでくる値ではないので、かなり気持ち悪いですが一旦はこれで解決しました。

何かもっと良い方法や筆者の認識や使い方が間違っている等あればご指摘頂ければなと思いますorz

PlayFrameworkには別の方法でカスタムバリデーションを実装出来る

ちなみに、PlayFrameworkではアノテーションではなくvalidateメソッドの@Overrideによって実現する事も出来ます。

Sometimes you need more sophisticated validation processes. E.g. when a user signs up you want to check if his email address already exists in the database and if so validation should fail.

Because constraints support both runtime Dependency Injection and , we can easily create our own custom (class-level) constraint which gets a Database object injected – which we can use later in the validation process. Of course you can also inject other components like MessagesApi, JPAApi, etc.Java Forms – 2.7.x

しかし、個人的な意見としては使い勝手はいまいちなのと複雑なのであまり使いたくありません。。。

本日のオススメ商品

終わりに

以上のように、フレームワークのかなりコアな部分が原因でした。

割と致命的な挙動だと思うので、お困りの方がいましたら是非試してみてください♪

336×280




336×280




CATEGORIES & TAGS

IT, , , , , , , , , ,

blogenist

Author: blogenist