错误提示信息的知识点分为两部分。
第一部分,内容。
第二部分,配置。配置有两种方式,内置的,自定义方式,实现MessageInterpolator接口。
1、内容
1.1 特殊字符
{, }, $, \为特殊字符,需要\转义。
1.2 注解属性
校验注解中的属性。例如@Size注解中的min,max。
@Size(min = 2, max = 14, message = "The license '${validatedValue}' size must be greater than {min} and smaller than {max}") private String licensePlate;
1.3 字段属性
Bean中字段属性值,通过${validatedValue}引用,可以使用java.util.Formatter的format方法进行格式化。
@Size(min = 2, max = 14, message = "The license '${formatter.format('%1$.2f', validatedValue)}' size must be greater than {min} and smaller than {max}") private String licensePlate;
引入时,需要配置级别(使用默认值即可),默认级别为BEAN_PROPERTIES,它的配置方式为:
.constraintExpressionLanguageFeatureLevel(level)
其中level的值有以下几种:
- NONE: 不支持任何属性,表达式等。
- VARIABLES: 支持表达式,properties文件,formatter对象。
- BEAN_PROPERTIES:在VARIABLES的基础上支持${validatedValue}
- BEAN_METHODS: 支持引用方法相关的内容。
2、配置
2.1 内置
由框架提供的配置方式本质上有两种,
第一种,设置注解的message属性,对应第一种方式。
第二种,根据配置文件,XX.properties,对应第二,第三,第四种方式。
方式一,在注解中设置message属性,值为错误信息。
@Min(value = 2, message="must be great than two") private int seatCount;
方式二,在注解中设置message属性,值为变量的key值,根据key值在ValidationMessages.properties下查找对应的value
// 制造商名称 @NotNull(message = "{manu_empty}") private String manufacturer; // 在validationMessages.properties文件中存在 manu_empty="The manufacturer must have a value"
方式三,与第二种方式类似,区别在于提供自定义的配置文件。
Validator validator = Validation.byDefaultProvider() .configure() .messageInterpolator( new ResourceBundleMessageInterpolator( new PlatformResourceBundleLocator( "MyMessages" ) ) ) .buildValidatorFactory() .getValidator();
方式四,与第三种方式相同,区别在于一次性提供多个配置文件。
.messageInterpolator( new ResourceBundleMessageInterpolator( new AggregateResourceBundleLocator( Arrays.asList("MyMessages","MyOtherMessages") ) )
2.2 自定义
第一步,实现MessageInterpolator接口。
public class MyMessageInterpolator implements MessageInterpolator { @Override public String interpolate(String messageTemplate, Context context) { //... return null; } @Override public String interpolate(String messageTemplate, Context context, Locale locale) { //... return null; } }
第二步,引入自定义实现类。
Validator validator = Validation.byDefaultProvider() .configure() .messageInterpolator( new MyMessageInterpolator() ) .buildValidatorFactory() .getValidator();