javaBean验证框架(3)—验证消息
javaBean验证规范需要每个约束注解定义中必须包括
message
元素。该元素在用户使用时是可选的,如果没有指定,缺省的message资源被展示。
message说明
我们从@NotNull注解的定义说起:
package javax.validation.constraints;
.....
public @interface NotNull {
String message() default "{javax.validation.constraints.NotNull.message}";
...
}
关于message须理解下面必要的内容:
- 当创建约束注解时,message元素必须被包括。我们可以指定一个缺省的资源key给message元素,或硬代码写死固定message文本。如果使用资源key,则必须在{…}中使用。
- 根据规范,资源key必须注解的完整名称加上.message
,如上面@NotNull定义的一样。这意味着消息应该是通用的,不应该和特定的客户端耦合。
- 客户端在使用可以指定新的message覆盖默认内容。
@NotNull(message="name must not be null to be valid")
String name;
上面的代码片段用户也可以使用新的资源key代码默认值,这时需要使用{}。
@NotNull(message="name must not be null to be valid")
String name;
- 如果你使用新的key或缺省key覆盖缺省的message,那资源文件必须在类路径下,且按规范命名,如为
ValidationMessages_zh.properties
,必须总是以ValidationMessages
开头,然后下划线跟上语言代码。缺省行为可以通过实现javax.validation.MessageInterpolator
去修改。
使用表达式语言
规范执行统一表达式语言(JSR 341),用于在验证message中动态评估表达式,所以在项目中我们需要引用javax.el-api
及其实现。
约束注释元素声明中值的替换
在message中,约束注解元素值可以通过{theElementName}
引用。举例:@Min(5)
,我们使用这样的message:'The min value must be {value}'.
,这里{value}
将被替换为5.
表达式也可以对内联消息或资源包文件进行评估。这是Hibernate 验证实现中一些资源示例,hibernate-validator-5.2.4.Final.jar!\org\hibernate\validator\ValidationMessages.properties:
javax.validation.constraints.DecimalMax.message = must be less than ${inclusive == true ? 'or equal to ' : ''}{value}
javax.validation.constraints.DecimalMin.message = must be greater than ${inclusive == true ? 'or equal to ' : ''}{value}
javax.validation.constraints.Digits.message = numeric value out of bounds (<{integer} digits>.<{fraction} digits> expected)
javax.validation.constraints.Max.message = must be less than or equal to {value}
javax.validation.constraints.Min.message = must be greater than or equal to {value}
javax.validation.constraints.Pattern.message = must match "{regexp}"
javax.validation.constraints.Size.message= size must be between {min} and {max}
* ${validatedValue}*
引用当前验证的值(property, bean, method parameter etc),举例:
public class TestBean {
@Size(min = 5, message ="The name '${validatedValue}' must be at least {min}" +
" characters long. Length found : ${validatedValue.length()}")
private String name;
// getters and setters
}
如果我们如下代码填充bean,然后运行验证:
public static void main (String[] args) {
TestBean testBean = new TestBean();
testBean.setName("Mike");
Validator validator = getValidator();
validator.validate(testBean).stream().forEach(ValidatedValueExample::printError);
}
运行结果为:
The name 'Mike' must be at least 5 characters long. Length found : 4
总结
本文介绍了约束注解的message,缺省的message可以被覆盖,也可以直接使用内联消息,并可通过表达式进行动态评估。详细代码可以从
这里下载,本文的示例可以看项目中ValidationDemo1
。