案例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.*;??
- ??
- ?
- ?
- ?
- ?
- ??
- @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);?????????????
- ??????????
- ????????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));