自定義注解與validation結合使用案例

 
案例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. ??
  6. import?javax.validation.Constraint;??
  7. import?javax.validation.ConstraintValidator;??
  8. import?javax.validation.ConstraintValidatorContext;??
  9. import?javax.validation.Payload;??
  10. ??
  11. import?org.springframework.data.mongodb.core.mapping.Document;??
  12. ??
  13. @Target({?ElementType.FIELD,?ElementType.METHOD?})??
  14. @Retention(RetentionPolicy.RUNTIME)??
  15. @Document??
  16. @Constraint(validatedBy?=?{?Name.NameChecker.class?})??
  17. public?@interface?Name?{??
  18. ????String?message()?default?"名稱不存在";??
  19. ??
  20. ????Class<?>[]groups()?default?{};??
  21. ??
  22. ????Class<??extends?Payload>[]payload()?default?{};??
  23. ??
  24. ????public?static?class?NameChecker?implements?ConstraintValidator<Name,?String>?{??
  25. ??
  26. ????????@Override??
  27. ????????public?void?initialize(Name?constraintAnnotation)?{??
  28. ??
  29. ????????}??
  30. ??
  31. ????????@Override??
  32. ????????public?boolean?isValid(String?value,?ConstraintValidatorContext?context)?{??
  33. ????????????if?("111111".equals(value))?{??
  34. ????????????????return?true;??
  35. ????????????}??
  36. ????????????return?false;??
  37. ????????}??
  38. ??
  39. ????}??
  40. }??

[java]?view plain?copy
  1. public?class?UserVo?{??
  2. ??
  3. ????@NotBlank(message?=?"[用戶名不能為空]")??
  4. ????@Length(max?=?64,?min?=?6,?message?=?"[用戶名]長度6~64")??
  5. ????@Name??
  6. ????private?String?username;??
  7. ??
  8. ????@NotBlank(message?=?"[密碼不能為空]")??
  9. ????@Length(max?=?64,?min?=?6,?message?=?"[密碼]長度6~64")??
  10. ????private?String?password;??
  11. ??
  12. ????@NotNull(message?=?"[出生日期不能為空]")??
  13. ????private?Date?birthDate;??
  14. }??

[java]?view plain?copy
  1. @RestController??
  2. @RequestMapping("/v0.1/users")??
  3. public?class?UserController?{??
  4. ??
  5. ????@Autowired??
  6. ????private?UserRecordService?service;??
  7. ??
  8. ????@RequestMapping(method?=?RequestMethod.POST)??
  9. ????public?UserRecord?add(@RequestBody?@Valid?UserVo?vo)?{??
  10. ????????UserRecord?user?=?new?UserRecord();??
  11. ????????BeanUtils.copyProperties(vo,?user);??
  12. ????????return?service.add(user);??
  13. ????}??
  14. ??
  15. ????@RequestMapping(method?=?RequestMethod.GET)??
  16. ????public?Items<UserRecord>?list(ListParam<UserRecord>?listParam){??
  17. ????????return?service.list(listParam);??
  18. ????}??
  19. }??

當username取值為"111111"時通過校驗,而當是其他值的時候,就會拋出校驗異常。


案例2?

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

調用
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));




本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387424.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387424.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387424.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

5 Vim編輯器的使用

vi filename 命令模式 a i o 插入模式 后前 行 Esc鍵 回到命令模式 Shift&#xff1a; 編輯模式 set nu加行號 執行完命令后直接回到命令模式 :set nu 設置行號 :set nonu 取消行號 移動命令&#xff1a; gg 到第一行 G 到最后一行 nG 到第n行 :n到第n行 $ 移至行…

機器學習實戰(筆記)------------KNN算法

1.KNN算法 KNN算法即K-臨近算法&#xff0c;采用測量不同特征值之間的距離的方法進行分類。 以二維情況舉例&#xff1a; 假設一條樣本含有兩個特征。將這兩種特征進行數值化&#xff0c;我們就可以假設這兩種特種分別為二維坐標系中的橫軸和縱軸&#xff0c;將一個樣本以點的形…

hive的安裝配置

hive只需安裝在一個節點上。 1、將安裝包解壓&#xff0c;cd入conf文件夾下&#xff0c;執行命令cp hive-default.xml hive-site.xml 2、更改hive-site.xml的配置項 </property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql:/…

Java注解Annotation 完成驗證

Java注解Annotation用起來很方便&#xff0c;也越來越流行&#xff0c;由于其簡單、簡練且易于使用等特點&#xff0c;很多開發工具都提供了注解功能&#xff0c;不好的地方就是代碼入侵比較嚴重&#xff0c;所以使用的時候要有一定的選擇性。 這篇文章將利用注解&#xff0c;來…

隱藏馬爾科夫模型HMM

概率圖模型 HMM 先從一個具體的例子入手,看看我們要解決的實際問題.例子引自wiki.https://en.wikipedia.org/wiki/Hidden_Markov_model Consider two friends, Alice and Bob, who live far apart from each other and who talk together daily over the telephone about what …

常用HQL

進入hive客戶端后&#xff1a; 1、建表&#xff1a; create table page_view(viewTime int, userid bigint,page_url string, referrer_url string,ip string comment IP Address of the User)comment This is the page view tablepartitioned by(dt string, country string)r…

阿里云天池 金融風控訓練營Task1 廣東工業站

Task1 賽題理解 一、學習知識點概要 本次學習先是介紹了賽題的背景和概況&#xff0c;題目以金融風控中的個人信貸為背景&#xff0c;給所給的47列特征中&#xff0c;根據貸款申請人的數據信息預測其是否有違約的可能&#xff0c;以此判斷是否通過貸款。隨后介紹了比賽中的評…

如何將.crt的ssl證書文件轉換成.pem格式

如何將.crt的ssl證書文件轉換成.pem格式摘自&#xff1a;https://www.landui.com/help/show-8127 2018-07-04 14:55:41 2158次 準備:有一臺安裝了php的linux操作系統執行下面的openssl命令即可&#xff1a;openssl x509 -in www.xx.com.crt -out www.xx.com.pem轉載于:https://…

SpringMVC學習記錄--Validator驗證分析

一.基于Validator接口的驗證. 首先創建User實例,并加入幾個屬性 ?12345678910111213141516171819202122232425262728293031323334<code class"hljs cs">public class User {private String username;private String password;private String nickname;public …

NTP時間服務器實現Linux時間同步

在linux下&#xff0c;可以通過自帶的NTP(Network Time Protocol)協議通過網絡使自己的系統保持精確的時間。 什么是NTP&#xff1f; NTP是用來使系統和一個時間源保持時間同步的協議。 在自己管理的網絡中建立至少一臺時間服務器來同步本地時間&#xff0c;這樣可以使得在不同…

阿里云天池 Python訓練營Task1:從變量到異常處理

本學習筆記為阿里云天池龍珠計劃Python訓練營的學習內容&#xff0c;學習鏈接為&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 目錄 一、學習知識點概要 二、學習內容 I.變量、運算符與數據類…

python回收機制

目錄 Python的垃圾回收機制引子:一、什么是垃圾回收機制&#xff1f;二、為什么要用垃圾回收機制&#xff1f;三、垃圾回收機制原理分析1、什么是引用計數&#xff1f;2、引用計數擴展閱讀&#xff1f;&#xff08;折疊&#xff09;Python的垃圾回收機制 引子: 我們定義變量會申…

安裝openssl-devel命令

centos&#xff1a; yum install openssl-devel ubuntu&#xff1a; sudo apt-get install openssl sudo apt-get install libssl-dev

阿里云天池 Python訓練營Task2: Python基礎練習:數據結構大匯總 學習筆記

本學習筆記為阿里云天池龍珠計劃Python訓練營的學習內容&#xff0c;學習鏈接為&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 目錄 一、學習知識點概要 二、學習內容 I.列表&#xff08;list…

windows文件與Linux文件互轉

使用命令 unix2dos filename dos2unix filename

1G.小a的排列(C++)

小a的排列&#xff08;C&#xff09; 點擊做題網站鏈接 題目描述 小a有一個長度為n的排列。定義一段區間是"萌"的&#xff0c;當且僅當把區間中各個數排序后相鄰元素的差為1現在他想知道包含數x,y的長度最小的"萌"區間的左右端點 也就是說&#xff0c;我們…

阿里云天池 Python訓練營Task3: Python基礎進階:從函數到高級魔法方法 學習筆記

本學習筆記為阿里云天池龍珠計劃Python訓練營的學習內容&#xff0c;學習鏈接為&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicamppython?spm5176.22758685.J_6770933040.1.6f103da1tESyzu 目錄 一、學習知識點概要 二、學習內容 I.函數 1.定義自己的函…

C# 獲取句柄程序

這個小程序需要用到系統API&#xff0c;也就是需要用到user32中的三個函數。 第一個&#xff1a;WindowFromPoint 返回一個窗口句柄 第二個&#xff1a;GetWindowText 獲取窗口標題 第三個&#xff1a;GetClassName 獲取類名 當然&#xff0c;最重要的一點就是要引用命名空間…

HBase安裝配置

HBase的安裝配置&#xff1a; 4臺主機&#xff1a;hdp0 hdp1 hdp2 hdp3 hdp0 hdp1 跑HMaster hdp2 hdp3 跑HRegionServer 將HBase解壓之后 1、確保安裝ZooKeeper&#xff1b; 2、修改hbase-env.sh export JAVA_HOME/.../jdk export HBASE_MANAGES_ZKfalse //使用外部的…

python cook讀書筆記第2章字符串和文本

使用多個界定符分割字符串 line asdf fjdk; afed, fjek,asdf, fooimport re# line re.split(r[;,\s]\s*,line)# print(line)# [asdf, fjdk, afed, fjek, asdf, foo]"""當你使用 re.split() 函數時候&#xff0c;需要特別注意的是正則表達式中是否包含一個括號…