Dón*_*nal 14 java validation spring-modules
我正在研究一种基于注释的方法来使用spring模块验证Spring bean .在本教程中,以下bean(省略了getters和setter)用作示例:
public final class User {
@NotBlank
@Length(max = 80)
private String name;
@NotBlank
@Email
@Length(max = 80)
private String email;
@NotBlank
@Length(max = 4000)
private String text;
}
Run Code Online (Sandbox Code Playgroud)
如果违反特定验证规则,则使用的错误消息应遵循以下格式:
bean-class.bean-propery[validation-rule]=Validation Error message
Run Code Online (Sandbox Code Playgroud)
上面显示的类的示例包括:
User.email[not.blank]=Please enter your e-mail address.
User.email[email]=Please enter a valid e-mail address.
User.email[length]=Please enter no more than {2} characters.
Run Code Online (Sandbox Code Playgroud)
消息键包含类名的事实存在一些问题:
如果我有另一个类(例如Person),其电子邮件属性与User.email相同,我需要复制消息,例如
Person.email [not.blank] =请输入您的电子邮件地址.
Person.email [email] =请输入有效的电子邮件地址.
Person.email [length] =请输入不超过{2}个字符.
实际上,文档声称可以为特定规则(例如@Email)配置默认消息,如下所示:
email=email address is invalid
Run Code Online (Sandbox Code Playgroud)
如果找不到规则的特定于bean的消息,则应使用此缺省消息.但是,我的经验是,这根本不起作用.
避免重复消息的另一种机制是将错误消息的密钥传递给规则注释.例如,假设我已为@Email规则定义了以下默认错误消息
badEmail=Email address is invalid
Run Code Online (Sandbox Code Playgroud)
如果我像这样注释相关属性,则应使用此消息:
@Email(errorCode="badEmail")
private String email;
Run Code Online (Sandbox Code Playgroud)
然而,我一次又一次地试了这个,它似乎没有用.有没有人找到一种方法来避免在使用此验证框架时重复错误消息?
我快速浏览了BeanValidator API,看起来您可能想尝试使用errorCodeConverter属性.
您需要实现自己的ErrorCodeConverter,还是使用其中一个提供的实现?
....
<bean id="validator" class="org.springmodules.validation.bean.BeanValidator"
p:configurationLoader-ref="configurationLoader"
p:errorCodeConverter-ref="errorCodeConverter" />
<bean id="errorCodeConverter" class="contact.MyErrorCodeConverter" />
....
Run Code Online (Sandbox Code Playgroud)
注意:configurationLoader是本教程中使用的配置XML中定义的另一个bean
示例转换器:
package contact;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springmodules.validation.bean.converter.ErrorCodeConverter;
public class MyErrorCodeConverter implements ErrorCodeConverter {
private Log log = LogFactory.getLog(MyErrorCodeConverter.class);
@Override
public String convertPropertyErrorCode(String errorCode, Class clazz, String property) {
log.error(String.format("Property %s %s %s", errorCode, clazz.getClass().getName(), property));
return errorCode; // <------ use the errorCode only
}
@Override
public String convertGlobalErrorCode(String errorCode, Class clazz) {
log.error(String.format("Global %s %s", errorCode, clazz.getClass().getName()));
return errorCode;
}
}
Run Code Online (Sandbox Code Playgroud)
现在属性应该工作:
MyEmailErrorCode=Bad email
class Foo {
@Email(errorCode="MyEmailErrorCode")
String email
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13623 次 |
| 最近记录: |