前言:当我们用
@valid
或者@validate
验证controller
层接收前端发来的对象数据时,在对象的实体类上的validation
相关的验证注解有起效了,很多时候我们会写message=“xxx”
自定义验证不通过的内容。例如:@NotNull(message = "id不能为空")
很不优雅。点开源码可以看见默认的message
,String message() default "{javax.validation.constraints.NotNull.message}";
,这就相当优雅了,设想我们有很多的业务有很多的业务提示,直接写死的话不够优雅,后期也不方便待修改,于是就有了这篇博客,使用国际化优雅的返回提示信息。本文从对validator
和国际化
的用法开始介绍。
validator数据验证
数据验证给了我们很多方便,避免了不少在接收完参数之后逐一验证参数的合法性所写的大量验证代码。
相关注解
@NotNull
不为空@NotBlank
不为空白NotEmpty
至少有一个@Range
指定范围@Length
指定长度范围@Min
不能小于最小值@Max
不能大于最大值@Email
邮箱验证@URL
指定URL
还有很多注解可查看javax.validation
和org.hibernate.validator
包。
@Validated 和 @Valid
@Valid
和@Validated
都可以用于验证,@Valid
是JSR-303规范的注解,可以用在参数、属性、嵌套属性上,@Validated
不能用在属性上。
但@Validated
支持分组。注解源码如下:
@Target({
ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Valid {
}
@Target({
ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Validated {
Class<?>[] value() default {
};
}
自定义注解验证
可以自定义验证的注解,需要实现
ConstraintValidator
注解。以下写一个样例,功能是验证地址只能是自己的安全列表中的地址。
@MustIn
:
@Target({
ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MustInConstraintValidator.class)
public @interface MustIn {
String message() default "不可输入非法地址";
Class<?>[] groups() default {
};
Class<? extends Payload>[] payload() default {
};
}
MustInConstraintValidator
:
public class MustInConstraintValidator implements ConstraintValidator<MustIn,String> {
private final String[] local = {
"安徽","淮南","寿县","北京","合肥","上海"};
private final Log logger = LogFactory.getLog(MustInConstraintValidator.class);
@Override
public void initialize(MustIn mustIn) {
logger.info("初始化自定义validate注解MustIn");
}
@Override
public boolean isValid(String value