私の Spring 4 駆動型ポートレットには、日付フィールドを含むデータ オブジェクトがあります。JSP ビューには、日付 (dd/mm/yyyy) と時刻 (hh/mm) という 2 つの個別のフィールドがあります。コントローラーのアクション ハンドラーは、@ModelAttribute
-annotation を使用してフォーム データを受け取ります。
@ActionMapping(params = "action=update")
public void onUpdate(@Valid @ModelAttribute("myObject") MyObject myObject,
BindingResult bindingResult, ActionResponse response, SessionStatus status)
{
if (!bindingResult.hasErrors())
myObjectService.save(myObject);
else
// provide 'myObject' in the view which displays validation errors
}
利用可能な日付全体に対してフィールドが1つしかないため、フォームデータが検証されてonUpdate()
受信される前に、日付と時刻をマージする必要があります。myObject
MyObject
java.util.Calendar
この必要性を回避するためのアイデア 1
MyObject
ここで、日付を の 2 つの個別のフィールドに分割し、必要に応じて値をマージするゲッターを提供することもできると考えました。
@Column(name = "begin")
public Calendar getBegin()
{
// return calendar object built from this.beginDate and this.beginTime
}
しかし、これはいくつかの理由で良い考えではないと思います (この質問を参照してください: Hibernate Annotations - which is better, field or property access? ) モデルオブジェクトをデータベースレコードのミラーにしたいので、そうする必要があります割り当てられる前に検証されます。
アイデア2
myObject
別のアプローチは、日付または時刻を設定するときに、オンデマンドでカレンダー オブジェクトを作成または変更することです。
@Column(name = "begin")
@Temporal(TemporalType.TIMESTAMP)
private Calendar begin;
public void setBeginDate(String value)
{
// assign a new calendar object to "begin", if "begin" is null
// set only day, month and year components on this calendar object
}
public void setBeginTime(String value)
{
// see "setBeginDate", do the same with hours and minutes
}
ここでの問題は、フィールド「日付」または「時刻」の 1 つだけが有効な場合に、新しいカレンダー オブジェクトが作成されることです。ビューのフィールドには、現在の日付または現在の時刻が入力されます (どちらの値が正しかったかによって異なります)。
isValidDate
モデルに別のプライベート フラグを追加することで、この問題を解決することもできます。しかし、これは不潔な解決策だと思います。
結論
myObject
コントローラー用とmyObject
実際のモデルオブジェクトとしては大きな違いがあると思います。myObject
検証されて「マッピング」されるとすぐに、モデルオブジェクトになる必要があります。
だからここに私の質問:
@ModelAttribute
最後のポイントは、一般的に悪い考えとして使用することを明らかにしていると思いますか?- または、インスタンスが作成される前にフォームデータをマッピングして検証する方法はあり
MyObject
ますか? - そうでない場合、どのように問題を解決することをお勧めしますか?