私はフォームの入力と検証にSpringを使用しています。フォームコントローラのコマンドには、編集中のモデルが含まれています。モデルの属性の中にはカスタムタイプがあります。たとえば、個人の社会保障番号はカスタムSSNタイプです。Springの検証、PropertyEditorが特定のエラーメッセージを生成する方法
public class Person {
public String getName() {...}
public void setName(String name) {...}
public SSN getSocialSecurtyNumber() {...}
public void setSocialSecurtyNumber(SSN ssn) {...}
}
と春のフォーム編集コマンドで人を包む:
public class EditPersonCommand {
public Person getPerson() {...}
public void setPerson(Person person) {...}
}
春がSSNにテキストを変換する方法を知らないので、私は、フォームコントローラのバインダーと顧客のエディタを登録します。
public class EditPersonController extends SimpleFormController {
protected void initBinder(HttpServletRequest req, ServletRequestDataBinder binder) {
super.initBinder(req, binder);
binder.registerCustomEditor(SSN.class, "person.ssn", new SsnEditor());
}
}
とSsnEditorはSSNオブジェクトにテキストに変換することができますちょうどカスタムjava.beans.PropertyEditor
です:
public class SsnEditor extends PropertyEditorSupport {
public String getAsText() {...} // converts SSN to text
public void setAsText(String str) {
// converts text to SSN
// throws IllegalArgumentException for invalid text
}
}
無効であり、SSNに変換できないsetAsText
遭遇テキストは、それはIllegalArgumentException
(のsetAsText
PropertyEditor
当たり仕様)をスローした場合。私が抱えている問題は、テキストをオブジェクトに変換する(PropertyEditor.setAsText()
経由)は、の前にが実行され、Springバリデーターが呼び出されるということです。 setAsText
がIllegalArgumentException
をスローすると、Springは単にerrors.properties
で定義された一般的なエラーメッセージを表示します。私が望むのは、入力されたSSNが無効である正確な理由に依存する特定のエラーメッセージです。理由は、PropertyEditor.setAsText()
で判断されます。私はIllegalArgumentException
のテキストにエラー理由のテキストを埋め込んでみましたが、Springはそれを一般的なエラーとして扱います。
解決方法はありますか?繰り返すには、PropertyEditor
によって生成された特定のエラーメッセージが、Springフォームのエラーメッセージに表示されます。私が考えることのできる唯一の選択肢は、コマンドにSSNをテキストとして保存し、バリデーターで検証を実行することです。 SSNオブジェクトへのテキストの変換は、フォームのonSubmit
で行われます。これは私のフォーム(とモデル)が多くのプロパティを持っているので、それほど望ましくありません。私は、それぞれのすべてのモデル属性をテキストフィールドとして持つコマンドを作成して維持する必要はありません。
上記の一例であり、「...なぜテキストとしてSSNを格納していない」私の実際のコードは、人/ SSNはありませんが、そうで応答する必要はありません
@Steve Kuo元の回答に追加 –