自定义注解与validation结合使用案例
案例1:
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- import javax.validation.Constraint;
- import javax.validation.ConstraintValidator;
- import javax.validation.ConstraintValidatorContext;
- import javax.validation.Payload;
- import org.springframework.data.mongodb.core.mapping.Document;
- @Target({ ElementType.FIELD, ElementType.METHOD })
- @Retention(RetentionPolicy.RUNTIME)
- @Document
- @Constraint(validatedBy = { Name.NameChecker.class })
- public @interface Name {
- String message() default "名称不存在";
- Class<?>[]groups() default {};
- Class<? extends Payload>[]payload() default {};
- public static class NameChecker implements ConstraintValidator<Name, String> {
- @Override
- public void initialize(Name constraintAnnotation) {
- }
- @Override
- public boolean isValid(String value, ConstraintValidatorContext context) {
- if ("111111".equals(value)) {
- return true;
- }
- return false;
- }
- }
- }
- public class UserVo {
- @NotBlank(message = "[用户名不能为空]")
- @Length(max = 64, min = 6, message = "[用户名]长度6~64")
- @Name
- private String username;
- @NotBlank(message = "[密码不能为空]")
- @Length(max = 64, min = 6, message = "[密码]长度6~64")
- private String password;
- @NotNull(message = "[出生日期不能为空]")
- private Date birthDate;
- }
- @RestController
- @RequestMapping("/v0.1/users")
- public class UserController {
- @Autowired
- private UserRecordService service;
- @RequestMapping(method = RequestMethod.POST)
- public UserRecord add(@RequestBody @Valid UserVo vo) {
- UserRecord user = new UserRecord();
- BeanUtils.copyProperties(vo, user);
- return service.add(user);
- }
- @RequestMapping(method = RequestMethod.GET)
- public Items<UserRecord> list(ListParam<UserRecord> listParam){
- return service.list(listParam);
- }
- }
当username取值为"111111"时通过校验,而当是其他值的时候,就会抛出校验异常。
案例2
- package com.nd.social.common.validation;
- import com.nd.gaea.WafException;
- import com.nd.gaea.client.WafResourceAccessException;
- import com.nd.social.common.util.UCHelper;
- import org.apache.commons.lang3.StringUtils;
- import org.springframework.web.client.ResourceAccessException;
- import javax.validation.Constraint;
- import javax.validation.ConstraintValidator;
- import javax.validation.ConstraintValidatorContext;
- import javax.validation.Payload;
- import java.lang.annotation.*;
- /**
- * uid是否属于当前上下文租户
- * 注:当被校验对象为空时,校验为通过,所以如果需要校验对象必填,请自行结合相关校验注解
- * Created by Zhang JinLong(150429) on 2016-09-18.
- */
- @Target({ElementType.FIELD, ElementType.METHOD})
- @Retention(RetentionPolicy.RUNTIME)
- @Constraint(validatedBy = {SameTenant.StringChecker.class, SameTenant.LongChecker.class})
- @Documented
- public @interface SameTenant {
- String message() default "用户不存在或者不属于当前组织";
- Class<?>[] groups() default {};
- Class<? extends Payload>[] payload() default {};
- class StringChecker implements ConstraintValidator<SameTenant, String> {
- @Override
- public void initialize(SameTenant arg0) {
- }
- @Override
- public boolean isValid(String uid, ConstraintValidatorContext context) {
- if (StringUtils.isBlank(uid)) {
- return true;
- }
- try {
- return UCHelper.isSameTenant(uid);
- } catch (WafResourceAccessException | WafException | ResourceAccessException e) {
- return false;
- }
- }
- }
- class LongChecker implements ConstraintValidator<SameTenant, Long> {
- @Override
- public void initialize(SameTenant arg0) {
- }
- @Override
- public boolean isValid(Long uid, ConstraintValidatorContext context) {
- if (null == uid) {
- return true;
- }
- try {
- return UCHelper.isSameTenant(uid.toString());
- } catch (WafResourceAccessException | WafException | ResourceAccessException e) {
- return false;
- }
- }
- }
- }
调用
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
- public interface ConstraintValidator<A extends Annotation, T> {
- // 在验证之前调用该方法
- void initialize(A constraintAnnotation);
- // 验证方法 返回false说明没有通过校验 value的类型T可以有多种类型时,如案例2写多个校验类
- boolean isValid(T value, ConstraintValidatorContext context);
- }
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结合使用案例相关推荐
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例...
本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...
- validation注解及自定义注解
Bean Validation 中内置的 constraint: @Null 被注释的元素必须为 null @NotNull 被注释的元素必须不为 null @AssertTrue 被注释的元素必须为 ...
- 自定义注解生成代码(三) 之javapoet案例实战
自定义注解生成代码(三) 之javapoet案例实战 前面两个章节主要介绍了 javapoet 的基础语法和基本使用,感兴趣的同学可以查看博客 自定义注解生成代码(一)之 javaPoetAPI详解 ...
- Java注解--一张图一案例掌握自定义注解
1.概述 是什么:是对方法.类.参数.包.域以及变量等进行代码功能的增强或者修改程序的行为等操作. 应用 跟踪代码依赖性,实现替代配置文件功能 在反射中使用Annotation,字段格式化(如:数据字 ...
- java 常见的注解,什么是注解,自定义注解案例(定义以及使用)模拟Junit
java 自定义注解 1.什么是注解? 注解和接口,类一样,都是属于一种数据类型. 注解可以在变量,方法,类之上加载 注解的作用: 1.编译检查 2.配置(分析代码) 3.生成帮助文档 注解可以有属性 ...
- Spring 自定义注解使用案例 首先创建一个注解@interface
在Spring中使用自定义注解的本质就是使用Spring 的 AOP编程. 首先创建一个注解@interface import org.springframework.data.mongodb.cor ...
- 自定义注解!绝对是程序员装大佬的利器!!
作者 l Hollis 来源 l Hollis(ID:hollischuang) 相信很多人对Java中的注解都很熟悉,比如我们经常会用到的一些如@Override.@Autowired.@Servi ...
- java自定义注解为空值_java自定义注解
1. Java注解(Annotation) Java注解是附加在代码中的一些元信息,用于一些工具在编译. 运行时进行解析和使用,起到说明.配置的功能. 注解相关类都包含在java.lang.annot ...
- java 外部覆盖内部配置,Spring 与自定义注解、外部配置化的结合使用
Spring 与自定义注解.外部配置化的结合使用 一.Java注解的简单介绍 注解,也叫Annotation.标注,是 Java 5 带来的新特性. 可使用范围 类.字段.方法.参数.构造函数.包等, ...
最新文章
- 脑机接口猴子通过“意念”打游戏!马斯克:未来能让瘫痪者用意念玩手机
- 身份证号信息后台匹配
- Silverlight 参考:三维效果(透视转换) -- MSN
- 大世界游戏制作:《幽灵行动·荒野》程序化技术介绍
- 如何使用 一行代码 搞定一组数据的(极值、平均值、中位数、四分位数、数量统计和标准差)
- 直播电商要处理好五个关系
- 今日头条挖角微信;中国 iPhone 购买意创新低;小程序将分级 | 极客头条
- git不同的平台配置不同的公钥秘钥(git配置多个公钥秘钥)(git不同的项目配置不同的公钥秘钥)
- 图形推理1000题pdf_这7道幼儿园数学思维题,能答对一半智商肯定不低
- python如何读取字符串最后一个字符_python 获取字符串最后一个字符
- 双态运维联盟(BOA)正式成立
- 机器人潘森护盾_新版潘森无伤抗塔 还能抵消死歌大招?E技能护盾机制全解析!...
- 怎么用软件设计班旗_设计制作:班旗设计
- Git error. Command: `git clone --mirror git://github.com/Sky24n/FlutterRepos.git
- ORB_SLAM2编译build_ros.sh时报错([rosbuild] Error from directory check: /opt/ros/kinetic/share)
- 【电子DIY】基于NE555制作的简易电子琴
- 麦田守望者--走出软件作坊:三五个人十来条枪 如何成为开发正规军(四十三)...
- 论文:Discriminative Triad Matching and Reconstruction for Weakly Referring Expression Grounding
- 切图工具:输出512*512切片大小的切片
- 汽车销售Spark数据处理和数据分析项目实战Dataframe
热门文章
- NYOJ 63 小猴子下落
- 一个机器周期 计算机_计算机科学组织| 机器周期
- Java IdentityHashMap putAll()方法与示例
- 关联查询数据重复怎么办_在设计数据表的时候,是一个宽表好,还是多个维度表好?...
- 如何 更换vue的图标_vue如何实现图标点击选中后换一个图标(只单选)
- uva 10570——Meeting with Aliens
- 19.删除链表的倒数第N个节点 golang
- C语言malloc和calloc的区别
- C++ 菱形继承 的 对象模型01
- [剑指Offer]替换空格