Spring验证,如何让PropertyEditor生成特定的错误消息
我正在使用Spring进行表单输入和验证。表单控制器的命令包含正在编辑的模型。模型的某些属性是自定义类型。例如,“人”的社会保险号是自定义的SSN类型。
public class Person { public String getName() {...}
public void setName(String name) {...}
public SSN getSocialSecurtyNumber() {...}
public void setSocialSecurtyNumber(SSN ssn) {...}
}
并在Spring表单编辑命令中包装Person:
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只是一个java.beans.PropertyEditor
可以将文本转换为SSN对象的自定义:
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
}
}
如果setAsText遇到无效且无法转换为SSN的文本,则它将抛出IllegalArgumentException
(根据PropertyEditor setAsText
规范)。我遇到的问题是(通过PropertyEditor.setAsText()
)文本到对象的转换发生在调用Spring验证程序之前。当setAsText抛出IllegalArgumentException
,春只显示在定义的一般错误消息errors.properties
。我想要的是一条特定的错误消息,具体取决于输入的SSN无效的确切原因。PropertyEditor.setAsText()
将确定原因。我尝试将错误原因文本嵌入的文本中IllegalArgumentException
,但是Spring只是将其视为一般错误。
有针对这个的解决方法吗?重复一遍,我想要的是由PropertyEditorSpring
表单上的错误消息显示的特定错误消息。我能想到的唯一替代方法是将SSN作为文本存储在命令中,并在验证器中执行验证。文本到SSN对象的转换将在表单的中进行onSubmit
。这不太理想,因为我的表单(和模型)具有许多属性,并且我不想创建和维护一个将每个模型属性都作为文本字段的命令。
上面只是一个示例,我的实际代码不是Person / SSN,因此无需回答“为什么不将SSN存储为文本…”
回答:
你正在尝试在活页夹中进行验证。那不是活页夹的目的。绑定器应该将请求参数绑定到你的支持对象,仅此而已。属性编辑器将字符串转换为对象,反之亦然-它并非旨在执行其他任何操作。
换句话说,你需要考虑关注点的分离-你正在尝试将功能扩展到一个对象,该对象只不过将字符串转换为对象,反之亦然。
你可以考虑将SSN对象分解为易于绑定的多个可验证字段(字符串对象,基本对象(如日期)等)。这样,你可以在绑定后使用验证器来验证SSN是否正确,也可以直接设置错误。使用属性编辑器,你将引发IllegalArgumentException,Spring会将其转换为类型不匹配错误,因为这就是事实-字符串与预期的类型不匹配。仅此而已。另一方面,验证者可以执行此操作。只要填充了SSN实例,就可以使用spring绑定标签绑定到嵌套字段-必须先使用new()对其进行初始化。例如:
<spring:bind path="ssn.firstNestedField">...</spring:bind>
但是,如果你确实想坚持下去,请让属性编辑器保留一个错误列表-如果要抛出IllegalArgumentException,请将其添加到列表中,然后抛出IllegalArgumentException(如果需要,请重新捕获)。因为你可以在与绑定相同的线程中构造属性编辑器,所以如果你简单地覆盖属性编辑器的默认行为,则这将是线程安全的-你需要找到用于绑定的钩子并覆盖它-执行相同的属性编辑器现在正在执行的注册(除了相同的方法外,以便可以保留对编辑器的引用),然后在绑定结束时,如果提供了公共访问器,则可以通过从编辑器中检索列表来注册错误。 。检索到列表后,你可以对其进行处理并相应地添加错误。
以上是 Spring验证,如何让PropertyEditor生成特定的错误消息 的全部内容, 来源链接: utcz.com/qa/405157.html