案例1:

[java] view plain copy
  1. import java.lang.annotation.ElementType;
  2. import java.lang.annotation.Retention;
  3. import java.lang.annotation.RetentionPolicy;
  4. import java.lang.annotation.Target;
  5. import javax.validation.Constraint;
  6. import javax.validation.ConstraintValidator;
  7. import javax.validation.ConstraintValidatorContext;
  8. import javax.validation.Payload;
  9. import org.springframework.data.mongodb.core.mapping.Document;
  10. @Target({ ElementType.FIELD, ElementType.METHOD })
  11. @Retention(RetentionPolicy.RUNTIME)
  12. @Document
  13. @Constraint(validatedBy = { Name.NameChecker.class })
  14. public @interface Name {
  15. String message() default "名称不存在";
  16. Class<?>[]groups() default {};
  17. Class<? extends Payload>[]payload() default {};
  18. public static class NameChecker implements ConstraintValidator<Name, String> {
  19. @Override
  20. public void initialize(Name constraintAnnotation) {
  21. }
  22. @Override
  23. public boolean isValid(String value, ConstraintValidatorContext context) {
  24. if ("111111".equals(value)) {
  25. return true;
  26. }
  27. return false;
  28. }
  29. }
  30. }
[java] view plain copy
  1. public class UserVo {
  2. @NotBlank(message = "[用户名不能为空]")
  3. @Length(max = 64, min = 6, message = "[用户名]长度6~64")
  4. @Name
  5. private String username;
  6. @NotBlank(message = "[密码不能为空]")
  7. @Length(max = 64, min = 6, message = "[密码]长度6~64")
  8. private String password;
  9. @NotNull(message = "[出生日期不能为空]")
  10. private Date birthDate;
  11. }
[java] view plain copy
  1. @RestController
  2. @RequestMapping("/v0.1/users")
  3. public class UserController {
  4. @Autowired
  5. private UserRecordService service;
  6. @RequestMapping(method = RequestMethod.POST)
  7. public UserRecord add(@RequestBody @Valid UserVo vo) {
  8. UserRecord user = new UserRecord();
  9. BeanUtils.copyProperties(vo, user);
  10. return service.add(user);
  11. }
  12. @RequestMapping(method = RequestMethod.GET)
  13. public Items<UserRecord> list(ListParam<UserRecord> listParam){
  14. return service.list(listParam);
  15. }
  16. }

当username取值为"111111"时通过校验,而当是其他值的时候,就会抛出校验异常。

案例2

[java] view plain copy
  1. package com.nd.social.common.validation;
  2. import com.nd.gaea.WafException;
  3. import com.nd.gaea.client.WafResourceAccessException;
  4. import com.nd.social.common.util.UCHelper;
  5. import org.apache.commons.lang3.StringUtils;
  6. import org.springframework.web.client.ResourceAccessException;
  7. import javax.validation.Constraint;
  8. import javax.validation.ConstraintValidator;
  9. import javax.validation.ConstraintValidatorContext;
  10. import javax.validation.Payload;
  11. import java.lang.annotation.*;
  12. /**
  13. * uid是否属于当前上下文租户
  14. * 注:当被校验对象为空时,校验为通过,所以如果需要校验对象必填,请自行结合相关校验注解
  15. * Created by Zhang JinLong(150429) on 2016-09-18.
  16. */
  17. @Target({ElementType.FIELD, ElementType.METHOD})
  18. @Retention(RetentionPolicy.RUNTIME)
  19. @Constraint(validatedBy = {SameTenant.StringChecker.class, SameTenant.LongChecker.class})
  20. @Documented
  21. public @interface SameTenant {
  22. String message() default "用户不存在或者不属于当前组织";
  23. Class<?>[] groups() default {};
  24. Class<? extends Payload>[] payload() default {};
  25. class StringChecker implements ConstraintValidator<SameTenant, String> {
  26. @Override
  27. public void initialize(SameTenant arg0) {
  28. }
  29. @Override
  30. public boolean isValid(String uid, ConstraintValidatorContext context) {
  31. if (StringUtils.isBlank(uid)) {
  32. return true;
  33. }
  34. try {
  35. return UCHelper.isSameTenant(uid);
  36. } catch (WafResourceAccessException | WafException | ResourceAccessException e) {
  37. return false;
  38. }
  39. }
  40. }
  41. class LongChecker implements ConstraintValidator<SameTenant, Long> {
  42. @Override
  43. public void initialize(SameTenant arg0) {
  44. }
  45. @Override
  46. public boolean isValid(Long uid, ConstraintValidatorContext context) {
  47. if (null == uid) {
  48. return true;
  49. }
  50. try {
  51. return UCHelper.isSameTenant(uid.toString());
  52. } catch (WafResourceAccessException | WafException | ResourceAccessException e) {
  53. return false;
  54. }
  55. }
  56. }
  57. }

调用

package com.pactera.testing.platform;import java.lang.reflect.Field;import com.pactera.model.platform.authority.SysUser;
import com.pactera.model.validations.valUserName;public class TestVal {public static void main(String[] args) throws Exception{SysUser user=new SysUser();user.setUserCode("123");valid(user);System.exit(0);}
public static valUserName dv=null;//解析的入口public static void valid(Object object) throws Exception{//获取object的类型Class<? extends Object> clazz=object.getClass();//获取该类型声明的成员Field[] fields=clazz.getDeclaredFields();//遍历属性for(Field field:fields){//对于private私有化的成员变量,通过setAccessible来修改器访问权限field.setAccessible(true);System.out.println(field.getName());validate(field,object);//重新设置会私有权限field.setAccessible(false);}}public static void validate(Field field,Object object) throws Exception{String description;Object value;value=field.get(object);System.out.println(value);dv=field.getAnnotation(valUserName.class);System.out.println( dv.message());}
}

3 ConstraintValidator

[java] view plain copy
  1. public interface ConstraintValidator<A extends Annotation, T> {
  2. // 在验证之前调用该方法
  3. void initialize(A constraintAnnotation);
  4. // 验证方法  返回false说明没有通过校验  value的类型T可以有多种类型时,如案例2写多个校验类
  5. boolean isValid(T value, ConstraintValidatorContext context);
  6. }

4 利用注解回写值

方法1:把输入进去的123修改成了777返回

import java.lang.reflect.Method;import com.pactera.model.platform.authority.SysUser;
import com.pactera.model.validations.valUserName;public class TestVal {public static void main(String[] args) throws Exception{SysUser user=new SysUser();user.setUserCode("123");valid(user);System.out.print("12345678765434567------"+user.getUserCode());//System.exit(0);}
public static valUserName dv=null;//解析的入口public static void valid(Object object) throws Exception{//获取object的类型Class<? extends Object> clazz=object.getClass();//获取该类型声明的成员Field[] fields=clazz.getDeclaredFields();//遍历属性for(Field field:fields){//对于private私有化的成员变量,通过setAccessible来修改器访问权限field.setAccessible(true);System.out.println(field.getName());validate(field,object,clazz);//重新设置会私有权限field.setAccessible(false);}}public static void validate(Field field,Object object,Class<? extends Object> clazz) throws Exception{try{String description;Object value;Class clazzzobj = object.getClass();//获取对象的类型  value=field.get(object);System.out.println(value);dv=field.getAnnotation(valUserName.class);System.out.println(   dv.message());String fieldName=field.getName();PropertyDescriptor pd = new PropertyDescriptor(fieldName, clazz);  Method setMethod = pd.getWriteMethod();  field.set(object, "7777");//    String temp ="777";value.toString();// Long.parseLong(fieldValue);  //    setMethod.invoke(clazzzobj, String.valueOf(temp));}catch(NullPointerException exp){}}
}

方法2

PropertyDescriptor pd = new PropertyDescriptor(fieldName, clazz);Method setMethod = pd.getWriteMethod();Long temp = Long.parseLong(fieldValue);setMethod.invoke(bean, String.valueOf(temp));



												

自定义注解与validation结合使用案例相关推荐

  1. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  2. validation注解及自定义注解

    Bean Validation 中内置的 constraint: @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 ...

  3. 自定义注解生成代码(三) 之javapoet案例实战

    自定义注解生成代码(三) 之javapoet案例实战 前面两个章节主要介绍了 javapoet 的基础语法和基本使用,感兴趣的同学可以查看博客 自定义注解生成代码(一)之 javaPoetAPI详解 ...

  4. Java注解--一张图一案例掌握自定义注解

    1.概述 是什么:是对方法.类.参数.包.域以及变量等进行代码功能的增强或者修改程序的行为等操作. 应用 跟踪代码依赖性,实现替代配置文件功能 在反射中使用Annotation,字段格式化(如:数据字 ...

  5. java 常见的注解,什么是注解,自定义注解案例(定义以及使用)模拟Junit

    java 自定义注解 1.什么是注解? 注解和接口,类一样,都是属于一种数据类型. 注解可以在变量,方法,类之上加载 注解的作用: 1.编译检查 2.配置(分析代码) 3.生成帮助文档 注解可以有属性 ...

  6. Spring 自定义注解使用案例 首先创建一个注解@interface

    在Spring中使用自定义注解的本质就是使用Spring 的 AOP编程. 首先创建一个注解@interface import org.springframework.data.mongodb.cor ...

  7. 自定义注解!绝对是程序员装大佬的利器!!

    作者 l Hollis 来源 l Hollis(ID:hollischuang) 相信很多人对Java中的注解都很熟悉,比如我们经常会用到的一些如@Override.@Autowired.@Servi ...

  8. java自定义注解为空值_java自定义注解

    1. Java注解(Annotation) Java注解是附加在代码中的一些元信息,用于一些工具在编译. 运行时进行解析和使用,起到说明.配置的功能. 注解相关类都包含在java.lang.annot ...

  9. java 外部覆盖内部配置,Spring 与自定义注解、外部配置化的结合使用

    Spring 与自定义注解.外部配置化的结合使用 一.Java注解的简单介绍 注解,也叫Annotation.标注,是 Java 5 带来的新特性. 可使用范围 类.字段.方法.参数.构造函数.包等, ...

最新文章

  1. 脑机接口猴子通过“意念”打游戏!马斯克:未来能让瘫痪者用意念玩手机
  2. 身份证号信息后台匹配
  3. Silverlight 参考:三维效果(透视转换) -- MSN
  4. 大世界游戏制作:《幽灵行动·荒野》程序化技术介绍
  5. 如何使用 一行代码 搞定一组数据的(极值、平均值、中位数、四分位数、数量统计和标准差)
  6. 直播电商要处理好五个关系
  7. 今日头条挖角微信;中国 iPhone 购买意创新低;小程序将分级 | 极客头条
  8. git不同的平台配置不同的公钥秘钥(git配置多个公钥秘钥)(git不同的项目配置不同的公钥秘钥)
  9. 图形推理1000题pdf_这7道幼儿园数学思维题,能答对一半智商肯定不低
  10. python如何读取字符串最后一个字符_python 获取字符串最后一个字符
  11. 双态运维联盟(BOA)正式成立
  12. 机器人潘森护盾_新版潘森无伤抗塔 还能抵消死歌大招?E技能护盾机制全解析!...
  13. 怎么用软件设计班旗_设计制作:班旗设计
  14. Git error. Command: `git clone --mirror git://github.com/Sky24n/FlutterRepos.git
  15. ORB_SLAM2编译build_ros.sh时报错([rosbuild] Error from directory check: /opt/ros/kinetic/share)
  16. 【电子DIY】基于NE555制作的简易电子琴
  17. 麦田守望者--走出软件作坊:三五个人十来条枪 如何成为开发正规军(四十三)...
  18. 论文:Discriminative Triad Matching and Reconstruction for Weakly Referring Expression Grounding
  19. 切图工具:输出512*512切片大小的切片
  20. 汽车销售Spark数据处理和数据分析项目实战Dataframe

热门文章

  1. NYOJ 63 小猴子下落
  2. 一个机器周期 计算机_计算机科学组织| 机器周期
  3. Java IdentityHashMap putAll()方法与示例
  4. 关联查询数据重复怎么办_在设计数据表的时候,是一个宽表好,还是多个维度表好?...
  5. 如何 更换vue的图标_vue如何实现图标点击选中后换一个图标(只单选)
  6. uva 10570——Meeting with Aliens
  7. 19.删除链表的倒数第N个节点 golang
  8. C语言malloc和calloc的区别
  9. C++ 菱形继承 的 对象模型01
  10. [剑指Offer]替换空格