Spring formBackingObject、ビジネス オブジェクトの作成、およびファクトリー
-
19-09-2019 - |
質問
Spring SimpleFormController でビジネス オブジェクトを formBackingObjects として使用するための設計の質問。
私たちのコントローラーの責任は、エンド ユーザーが新しいビジネス オブジェクトを Web アプリケーションに追加できるようにすることです。
したがって、formBackingObject(HttpServletRequest request) メソッドを通じてビジネス オブジェクトを渡します。しかし、難問に遭遇しました。
新しいビジネス オブジェクトの作成に使用しているファクトリでは、一部の属性を null にすることができないというビジネス ルールが適用されます。しかし、エンドユーザーが何を入力したいのかわからないため、「必要な名前を入力してください」のような「妥当なデフォルト」を渡してきましたが、それはよく言ってもハッキー/不快に思えます。
開発者は何をすべきでしょうか?これは典型的な鶏が先か卵が先かの問題であるように感じます。
すべてのビジネス オブジェクトはインターフェイスに基づいています。ビジネス オブジェクトを表すスタブを作成し、そのスタブを formBackingObject として渡し、フォーム送信時にそのスタブをファクトリに渡す必要がありますか?それとも、formBackingObject には何も渡さず、リクエストから送信された情報を手動で収集する必要がありますか?
他に合理的なアイデア/パターンはありますか?
お時間をいただきありがとうございます。
解決
私は間違いなくformBackingObjectを使用して、手動で情報を収集しないオプションを選択しないだろう - 。最初の場所でSpring MVCのは価値があるになり、電力の多くを排除するであろう。
私があなただったら、私はちょうど新しい工場、またはファクトリメソッドになるだろう、それを具体的に「初期化されていない」ビジネス・オブジェクトを作成し、そしてあなたのformBackingObjectとしてそれを使用するように設計されています。
広く使用されている別のアプローチは、すべてのあなたのformBackingObjectとしてビジネスオブジェクトを使用しますが、その唯一の目的であるformBackingObjectこと(そして、あなたをすることができますあなたのビジネス・オブジェクトのファクトリメソッドを追加するための独立したトランスポート・オブジェクトを作成することではありません)トランスポート・オブジェクトからそれを初期化します。このの大きな利点の1つは、あなたのビジネス・オブジェクトがその中に他のオブジェクトの深い木を持っている場合、これはそれが痛みがformBackingObjectとして使用することができますです。あなただけformBackingObjectとして使用するための独立したトランスポート・オブジェクトを作成した場合、あなたはそれをはるかに平坦な構造を与えることができます。
他のヒント
コマンド オブジェクト (非常に単純な POJO) を使用して、コントローラーへのユーザー入力を表します。次に、Spring MVC に組み込まれた検証を使用して、すべての必須フィールドがコマンド オブジェクトに指定されていることを確認できます。コマンドが検証に合格した場合は、プログラムで (または次のような Bean マッピング ライブラリを使用して) それを「ビジネス オブジェクト」にマップできます。 ドーザー).
このようにして、既存のビジネス ロジック/ルール/サービス クラスに触れたり変更したりすることなく、検証や不完全なユーザー送信などを処理できます。これにより、Web レイヤーをこれらの既存のレイヤーから分離したままにすることができます。
参考までに、以下を参照してください。 MVC チュートリアル, の検証とコマンド オブジェクトについて触れます。 パート 4.