javaBean验证框架(3)—验证消息

来源:互联网 发布:搞笑相机软件大全 编辑:程序博客网 时间:2024/06/06 00:21

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