2

タイプ Load のエンティティを作成することになっているフォームがありますが、何らかの理由で、エンティティの関連付けに関連するデータ (load.user、load.client など) を実際に渡したり見たりしていないようです。 )。これはすべて正常に機能していましたが、一連のリファクタリング中のある時点で機能しなくなりました (どのモデルのフィールドも変更されませんでした)。現在、私のウェブサイトのすべてのフォームが同じように壊れており、どこを調べて修正を開始すればよいかわかりません.

ビューから、新しい Load のフォームを送信し、途中で可能な限りデータを出力します。サーバーに送信されるデータを送信前に印刷すると、すべてのデータが本来あるべき状態であることが示されます。コントローラーで印刷するForm.form(Load.class).bindFromRequest()と、フォームのデータに必要なものがすべて含まれていることがわかります。たとえば、値user.id=1がデータに含まれています。ただし、ユーザーが見つからないという検証エラーもあります。どうすればいいの?

Form(of=class models.Load, data={ a bunch of stuff, user.id=1, a bunch more stuff}, value=None, errors={=[ValidationError(,Logged in user is missing or invalid.,[])]})

検証エラーはpublic String validate()Load クラスで生成されていif(user==null)ます。これは、その文字列をチェックして返すだけです。複数のエンティティを送信するすべてのフォーム (たとえば、Dock を送信してから Dock の場所も送信する) は、メイン エンティティ (この例では Dock) のみを保存し、他のすべてを無視することに注意してください (Dock の場所は保存されません。ただし、Dock はモデル内でカスケードし、場所も保存します)。フォーム フィールドはすべて正しくラベル付けされています。このコードは、不思議なことに機能しなくなる前のある時点で機能していました。

では、フォームのメイン モデル以外のすべてのフォームが突然正しく処理されなくなったのはなぜでしょうか? bindFromRequest() に含まれるデータを「見る」ことさえできないかのようです。this.status など、Load の検証メソッドで変数を出力すると、正しいものが出力されます。しかし、this.user.id や this.client.id のようなものを印刷しようとすると、null ポインター エラーが発生します。データ ( ) を実際に解釈user.id=1して Load に関連付けられたユーザーに変換する Play のコードはどこにありますか? また、どのように壊れる可能性がありますか?

編集:また、はい、「クリーンプレイ」を試しました。通常、これらのような奇妙なエラーを修正するため、最初に試しました。しかし、今回はサイコロはありません。

Edit2: 役立つ場合に備えて、フォームから html を含めています。

<input type="text" id="user_id" name="user.id" value="1" class="idfield">

Edit3: リファクタリング中に行った唯一の変更で、これに影響を与えた可能性があるのは、Load.setBroker() のようないくつかのセッター メソッドを作成する必要があったことです。たとえば、load.broker=aBroker以前は Load の Broker を設定していなかったため、public void setBroker(Broker broker)Load でメソッドを作成する必要がありました。Play は自動生成されたセッターを使用してデータをバインドしますか? それらを上書きすると問題が発生する可能性はありますか?

4

1 に答える 1

2

おっと、私はそれを理解しました。それは私が書いたセッターでした。それらのいくつかは純粋に誤って非公開に設定されており、データをバインドするときに Play が値を設定できなかったようです。それらをすべて公開に変更し、謎のエラーが消えました。

于 2013-07-29T20:24:37.780 に答える