自定義註解 反射

2021-08-25 06:07:42 字數 4138 閱讀 3697

需求:在做許可權平台的時候,需要寫乙個查詢審計記錄列表的介面。這個需求看起來非常簡單,就是從資料庫單錶裡面查出資料,返回json格式。然而,資料庫裡有兩列,修改前和修改後的json。需要翻譯成字串整個返回。

資料庫的source欄位的json長這樣:

]",

"status": "used",

"end_date": "",

"is_delete": false

}

其中dimension_detail_id的翻譯是這個需求的難點,我想了好久。這是乙個維度和維度明細的組合id,「1」為維度表的id,"25be5b44ea4d05fce0530a10122994d6","25be5ca451fa0742e0530a1012271a15"為維度明細表的id。

我需要通過這串id組合翻譯成這樣。因為格式會根據策略而改變,所以要做到通用。

解決方案:

1.自定義審計格式化的註解auditformatter

@retention(retentionpolicy.runtime)

@target()

public @inte***ce auditformatter

public enum audittype
2.建立乙個commonaudit的抽象類

@component

public abstract class commonaudit

2.因為現在只是先做使用者許可權策略(userpermissionstrategy),所以先以使用者許可權策略為例,建立userpermissionaudit類繼承commonaudit。

@component

@auditformatter(name="使用者許可權",type=audittype.bean)

public class userpermissionaudit extends commonaudit

public void setuserid(string userid)

public string getpermission_id()

public void setpermission_id(string permission_id)

public date getstart_date()

public void setstart_date(date start_date)

public date getend_date()

public void setend_date(date end_date)

public string getdimension_detail_id()

public void setdimension_detail_id(string dimension_detail_id) );

if(null!=list&&list.size()>0)

dimension.setdetails(dimensiondetails);

dimensions.add(dimension);}}

setdimensions(dimensions);}}

}public listgetdimensions()

public void setdimensions(listdimensions)

}

3.但是userpermissionaudit中的dimension_detail_id存的只是一串id呀,我要的應該是id對應的物件,所以,接著建立使用者許可權維度類,同樣繼承commonaudit

@component

@auditformatter(name="維度",type=audittype.bean)

public class userpermissiondimensionaudit extends commonaudit

public void setid(string id)

public listgetdetails()

public void setdetails(listdetails)

}

4.維度裡面又有維度明細,繼續往下建立

@component

@auditformatter

public class userpermissiondimensiondetailaudit extends commonaudit

public void setid(string id)

}

5.接下來就是寫介面的邏輯了

@service

public class systemauditservice

pageauthzlogvopage = systemauditdao.queryauthzlog(authzlogsearchparam);

listdata = authzlogvopage.getdata();

for (authzlogvo authzlogvo : data)

// 處理修改後

string target = authzlogvo.gettarget();

if (stringutils.isnotempty(target))

// **詳情直接展示bussinessid

// 處理物件列

string type = authzlogvo.gettype();

// 資料**型別的物件列展示應用名稱

if (type.equals(authzlogtypeenum.recycle))

} else if (type.equals(authzlogtypeenum.requestnote)) );

if (map.containskey("user_id") || map.containskey("user_id")) }}

}return jsonresultenum.success.jsonresult(authzlogvopage);

}stringbuilder sb = new stringbuilder();

string type = strategyid.replaceall("strategy", "audit");

commonaudit common = springutil.getbean(type, commonaudit.class);

common = jsonutil.json2bean(source, common.getclass());

auditformatter annotation = common.getclass().getannotation(auditformatter.class);

return sb.tostring();

}// bean型別,繼續遞迴

if (annotation.type().equals(audittype.bean)) catch (exception e) }}

}else if(value instanceof list)

}} else if (annotation.type().equals(audittype.string)) else

} else if (annotation.type().equals(audittype.date)) else }}

/*** 以後可能會拓展成多引數翻譯

* @param value

* @param params

* @return

*/value = value.replaceall("\\$i18n", jdbcdao.geti18n());

return value;}}

主要的翻譯處理邏輯在formatter和excute裡面。主要用到了自定義註解+反射來完成這次需求。

通過這次看似簡單的需求,卻不簡單,這也反應出了我在技術上的不足。畢業一年了,之前在工作中完全沒用過自定義註解和反射。所以一開始做這個需求的時候,我幾乎是硬編碼寫完的。我的大佬給了我方向讓我去做,在做的過程,還去了解了一些設計模式,學習了策略模式和介面卡模式。

自定義註解和反射例項

自定義註解和反射例項 author 這個例子是說實體和資料庫對應表的對映,可以在實體上面使用註解。public class tannotationclass 下面是備註接的類 class person 下面是自定義註解 target elementtype.field 註解是給屬性使用的 reten...

自定義註解

target elementtype.field retention retentionpolicy.runtime public inte ce setvalue以上就是乙個自定義的註解,下面來進行說明。target elementtype.field 表示支援該註解的程式元素,field就是屬性...

自定義註解

三個重要元註解 target 即註解的作用域,用於說明註解的使用範圍 即註解可以用在什麼地方,比如類的註解,方法註解,成員變數註解等等 elemenettype.constructor 構造器宣告 elemenettype.field 域宣告 包括 enum 例項 elemenettype.loca...