生活随笔
收集整理的這篇文章主要介紹了
自定义注解与validation结合使用案例
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
案例1:
[java]?view plain
?copy 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;?? ????????}?? ?? ????}?? }??
[java]?view plain
?copy 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;?? }??
[java]?view plain
?copy @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);?? ????}?? }??
當(dāng)username取值為"111111"時通過校驗(yàn),而當(dāng)是其他值的時候,就會拋出校驗(yàn)異常。
案例2?
[java]?view plain
?copy 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?"用戶不存在或者不屬于當(dāng)前組織";?? ?? ????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;?? ????????????}?? ????????}?? ????}?? }??
調(diào)用
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來修改器訪問權(quán)限field.setAccessible(true);System.out.println(field.getName());validate(field,object);//重新設(shè)置會私有權(quán)限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 public?interface?ConstraintValidator<A?extends?Annotation,?T>?{?? ?????????? ????????void?initialize(A?constraintAnnotation);????????????? ?????????? ????????boolean?isValid(T?value,?ConstraintValidatorContext?context);?? }??
4 利用注解回寫值
方法1:把輸入進(jìn)去的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來修改器訪問權(quán)限field.setAccessible(true);System.out.println(field.getName());validate(field,object,clazz);//重新設(shè)置會私有權(quán)限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));
總結(jié)
以上是生活随笔為你收集整理的自定义注解与validation结合使用案例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。