SpringMVC验证框架Validation自定义注解实现传递参数到国际化资源文件

关于SpringMVC验证框架Validation的使用方法,不是本篇的重点,可参见博文SpringMVC介绍之Validation

在使用Validation时,一定有朋友遇到过一个问题,那就是:无法传递参数到国际化资源文件properties错误描述中。

举个例子:

User类中

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @NotEmpty(message="{password.empty.error}")  
  2. private String password;  

资源文件validation_zh_CN.properties中为

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. password.empty.error=password不能为空  

实际开发中,很多参数都是要验证非空的,如果每个参数都单独加个错误描述,是很麻烦的。properties虽支持“{}”的写法传递参数,但使用JSR-303注解无法实现传递参数。我想了个办法可通过自定义注解方式实现。


首先,建立个自定义的@NotEmpty注解:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.itkt.payment.core.annotation;  
  2.   
  3. import java.lang.annotation.ElementType;  
  4. import java.lang.annotation.Retention;  
  5. import java.lang.annotation.RetentionPolicy;  
  6. import java.lang.annotation.Target;  
  7.   
  8. import javax.validation.Constraint;  
  9. import javax.validation.Payload;  
  10.   
  11. import com.itkt.payment.core.handler.NotEmptyValidator;  
  12.   
  13. @Retention(RetentionPolicy.RUNTIME)  
  14. @Target( { ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER })  
  15. @Constraint(validatedBy = { NotEmptyValidator.class })  
  16. public @interface NotEmpty {  
  17.   
  18.     String field() default "";  
  19.   
  20.     String message() default "{com.itkt.payment.core.handler.NotEmpty.message}";  
  21.   
  22.     Class<?>[] groups() default {};  
  23.   
  24.     Class<? extends Payload>[] payload() default {};  
  25. }  

自定义的NotEmpty注解中,我们新加了field字段,用于标识字段名称。

然后,建立NotNullValidator实现类:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.itkt.payment.core.handler;  
  2.   
  3. import javax.validation.ConstraintValidator;  
  4. import javax.validation.ConstraintValidatorContext;  
  5.   
  6. import com.itkt.payment.core.annotation.NotNull;  
  7.   
  8. public class NotNullValidator implements ConstraintValidator<NotNull, Object> {  
  9.   
  10.     @Override  
  11.     public void initialize(NotNull annotation) {  
  12.     }  
  13.   
  14.     @Override  
  15.     public boolean isValid(Object str, ConstraintValidatorContext constraintValidatorContext) {  
  16.         return str != null;  
  17.     }  
  18.   
  19. }  

之后,在资源文件validation_zh_CN.properties中,改变写法:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. password.empty.error={field}不能为空  

最后,我们就可以在User类中使用自定义的NotEmpty注解:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. @NotEmpty(field = "password", message = "{password.empty.error}")  
  2. private String password;  


实际上,国际化资源文件本身支持从JSR-303注解中获取属性的参数值的,例如从@Length注解中,获取min和max属性的值:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. username.length.error=用户名长度必须在{min}-{max}之间  

之所以自带的@NotEmpty注解无法实现,是因为没有一个属性能传递字段名,所以通过自定义@NotEmpty注解来拓展个field字段。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值