日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自定义注解与validation结合使用案例

發(fā)布時間:2023/11/30 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义注解与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.*;??
  • ??
  • /**?
  • ?*?uid是否屬于當(dāng)前上下文租戶?
  • ?*?注:當(dāng)被校驗(yàn)對象為空時,校驗(yàn)為通過,所以如果需要校驗(yàn)對象必填,請自行結(jié)合相關(guān)校驗(yàn)注解?
  • ?*?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?"用戶不存在或者不屬于當(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>?{??
  • ????????//?在驗(yàn)證之前調(diào)用該方法??
  • ????????void?initialize(A?constraintAnnotation);?????????????
  • ????????//?驗(yàn)證方法??返回false說明沒有通過校驗(yàn)??value的類型T可以有多種類型時,如案例2寫多個校驗(yàn)類??
  • ????????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)容還不錯,歡迎將生活随笔推薦給好友。