春季验证,如何让属性编辑器生成特定的错误消息
我正在使用Spring进行表单输入和验证。窗体控制器的命令包含正在编辑的模型。模型的某些属性是自定义类型。例如,“人员”的社会安全号码是自定义 SSN 类型。
public class Person {
public String getName() {...}
public void setName(String name) {...}
public SSN getSocialSecurtyNumber() {...}
public void setSocialSecurtyNumber(SSN ssn) {...}
}
并将“人”包装在 Spring 表单编辑命令中:
public class EditPersonCommand {
public Person getPerson() {...}
public void setPerson(Person person) {...}
}
由于Spring不知道如何将文本转换为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 的文本,则抛出(根据 的规范)。我遇到的问题是,文本到对象的转换(通过)发生在我的Spring验证器被调用之前。当抛出时,Spring只显示 中定义的一般错误消息。我想要的是一个特定的错误消息,该消息取决于输入的SSN无效的确切原因。 将确定原因。我尝试在 的文本中嵌入错误原因文本,但Spring只是将其视为一般错误。setAsText
IllegalArgumentException
PropertyEditor
setAsText
PropertyEditor.setAsText()
setAsText
IllegalArgumentException
errors.properties
PropertyEditor.setAsText()
IllegalArgumentException
有解决方案吗?重复一遍,我想要的是将生成的特定错误消息呈现到Spring表单上的错误消息中。我能想到的唯一替代方法是将SSN存储为命令中的文本,并在验证器中执行验证。文本到 SSN 对象的转换将在表单的 .这不太可取,因为我的窗体(和模型)具有许多属性,并且我不想创建和维护将每个模型属性作为文本字段的命令。PropertyEditor
onSubmit
以上只是一个例子,我的实际代码不是Person / SSN,所以没有必要回复“为什么不将SSN存储为文本......”