Touch 方法属性 映射工具
Touch 方法&屬性 映射工具(0.5 版本)
標簽 : github
線上后門與接口調試:
原先需要測試一個接口(如Dubbo、DAO), 或為線上留后門, 需要寫大量的Web層(Api、Servlet或Controller)代碼并在瀏覽器觸發, 進而調用到實際想要執行的方法或想查看的屬性, 而有了Touch后, 你可以專注于業務功能的實現, 而不需要再書寫這些跟業務無關的觸發代碼.
- project: https://github.com/feiqing/touch
- git: https://github.com/feiqing/touch.git
版本歷史
0.0 版本
- Touch的第一個發布版本
- 接口映射最核心功能
- 基于Web.xml的配置: 類掃描Touch
- @Touch的touchPattern屬性提供Touch別名
- 第一版com.vdian.touch.converter.Converter
- @TouchArg注解獲取參數泛型類型
0.1版本
- 增加Switcher接口, 增加線上環境安全校驗
- Converter 添加@TouchArg參數
- 增加Converter與Switcher的默認綁定
- fix 空QueryString bug
- fix 重載函數定位不準 bug
0.2版本
- 增加包掃描功能, 精簡web.xml內關于Touch的配置
- 增加ZookeeperSwitcher實現, 提供基于ZK集群的Touch安全控制
- 增加lists.do 接口提供獲取touch context內容
- fix fastjson循環引用 bug
0.3版本
- 0.3.0
刪除@TouchArg注解, 動態獲取泛型參數類型 - 0.3.1 版本: 提高響應速度的同時降低內存占用
- init時緩存方法參數名、參數類型、參數泛型類型, 加速參數映射速度
- 使用WeakHashMap替換HashMap存儲TouchContext, 占用的內存隨GC而釋放, 再次調用時重新init.
- 3.2 版本
更新Converter<T>接口, 添加Type[] actualTypes參數代表泛型真實類型, 非泛型參數為null;
0.4版本
- 0.4.0
- 將@Touch從annotation包內移出, 直接放在com.vdian.touch包下
- 棄用web.xml配置, 使用Servlet 3.0 api實現OnTouchServlet自動注冊(默認攔截/touch/*目錄URL).
- 將配置集中放入touch.xml(classpath下)中, 并新增touch.xsd約束(已經放如touch.jar包內), 書寫touch.xml可實現代碼提示.
- 更新TouchSwitcher接口, 添加init(Map<String, String> config)方法, 創建TouchSwitcher實例時調用(且只調用一次), 將在touch.xml <switch> <config .../> <switch>標簽內容傳入init().
- 更新ZookeeperSwitcher實現, 支持自定義指定ZK集群.
- fix Bean被AOP代理后找不到的Bug(但目前還不能支持Bean被JDK的同時對Bean Alias的情況).
- fix jaxp-dom讀取注釋的bug
- 0.4.1
- 使用GuavaCache替換WeakHashMap, 使key在不活躍1小時后失效, 解決頻繁訪問&頻繁GC的問題.
- fix json字符串無法反序列化為String的問題
- fix 應用占用lists.do(打印所有touchPattern)的問題
0.5 版本
- 0.5.0
- 去掉loadOnStartup, Touch不再隨應用啟動而初始化, 改為第一次訪問時初始化;
- 將@Touch移植到filed上, 支持成員變量映射(預計12月中旬發布);
- fix 同名touchPattern bug;
接下來到2017年不會再有大版本的更新, 而致力于使Touch更加穩定, 提供更高性能, 適用更多項目類型.
入門
1. pom
<dependency><groupId>com.vdian.touch</groupId><artifactId>touch</artifactId><version>0.5.0-SNAPSHOT</version></dependency>2. touch.xml(maven項目需要放在resource目錄下)
<?xml version="1.0" encoding="utf-8"?> <touch xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.vdian.net/touch"xsi:schemaLocation="http://www.vdian.net/touchhttp://www.vdian.net/touch.xsd"><packages><!-- package最少有一個(可以多個), 否則touch.xsd驗證不通過, 且啟動時會拋異常 --><package>com.vdian.demo</package></packages><converters><!-- 默認已經注冊了下面三個Converter, 如果沒有自定義的Converter可以去掉這整個 converters 的配置 --><converter>com.vdian.touch.converter.CalendarConverter</converter><converter>com.vdian.touch.converter.DateConverter</converter><converter>com.vdian.touch.converter.SetConverter</converter></converters><switchers><!-- 默認沒有注冊任何Switcher, 如果需要使用ZookeeperSwitcher, 需要在項目pom中添加curator-recipes的依賴, 該依賴默認在Touch中是optional的 --><switcher class="com.vdian.touch.switcher.ZookeeperSwitcher"><config key="zookeeper" value="zookeeper.address:2181"/><config key="touchPath" value="/touch/touch-switcher"/><config key="touchKey" value="touch_open"/></switcher></switchers></touch>注意: touch.xml只需放在項目classpath下即可, Touch會自動去到classpath目錄下掃描該文件, 不必被Spring托管.
3. @Touch
為想要touch的方法打上@Touch注解, 馬上她就屬于你啦:
4. 瀏覽器輸入
http://localhost:8080/touch/constumObject? // 方法名{"user": { // 方法參數名"name": "feiqing", // 方法參數值"age": 18},"date": "1992-03-20 01:01:01","users": [{"name": "feiqing","age": 18},{"name": "feiqing2","age": 98}]}這樣, 你就可以愉快的touch一把:
注:
- 從0.4版本開始棄用web.xml配置, 啟用Servlet 3.0 api, OnTouchServlet自動注冊到Servlet容器內.
- 從0.2版本開始Touch不再支持on_touch_class配置, 全面換成包掃描packages .
- 使用Touch的Servlet自動注冊需要在項目中啟用Servlet 3.0(web.xml頭更新成如下即可, 否則還是需要像以前一樣手動注冊, 見注釋), 且保證項目內Servlet-api已達到3.0及以上版本(Touch的pom已經引入, 但要防止被其他配置沖掉).
進階
1. 同名方法
@Touch注解內提供了touchPattern參數用于區分重載方法, 但要注意touchPattern要和瀏覽器內的URI(如前面的constumObject)對應起來.
2. Converter與參數映射
參數映射
我們默認使用json與方法參數一一映射, 外層json的key為方法參數名.自定義Converter
Converter大部分情況下是不用配的, Touch默認為我們綁定了很多類型:- String -> 八種Java基礎及包裝類型
- String -> String
- String -> Date(“yyyy-MM-DD HH:MM:SS”)
- String -> List
- String -> Set
- String -> Map
3. Switcher與安全性
Touch開放了TouchSwitcher接口來提高touch接口的安全性:
public interface TouchSwitcher {/*** init when new TouchSwitcher instance.** @param config in touch.xml <switcher><config ... /> ...</switcher>*/void init(Map<String, String> config);boolean isSwitchOn(String touchPattern, String queryString); }如果想實現自己的安全過濾規則, 可參考ZookeeperSwitcher(基于Zookeeper).
屬性映射(0.5 版本新功能)
@Component public class TouchTestCaseImpl implements TouchTestCase {@Touchprivate String p1;@Touchprivate Date p2;@Touchprivate Map<String, Object> p3;@Touchprivate Set<String> p4;@Touchprivate int p5;@Touchprivate char p6;@Touchprivate User user;@Touchprivate List<User> users;// ... }在瀏覽器訪問:
http://localhost:8080/touch/p1?string http://localhost:8080/touch/p2?2012-01-05 12:30:30 http://localhost:8080/touch/p3?{"key1":"value1", "key2", 2} http://localhost:8080/touch/p4?["set1", "set2"] http://localhost:8080/touch/p5?88 http://localhost:8080/touch/p6?A http://localhost:8080/touch/user?{"name":"jifang", "age":8} http://localhost:8080/touch/users?[{"name":"jifang", "age":8},{"name":"jifang2", "age":18}]即可映射&修改&獲取屬性值.
未來規劃
1. 方法參數名
Touch當前版本獲取方法參數名是從JVM的MethodArea用javassist獲取, 其性能很難估計, 如果將來我們需要提升性能, 可以添加類似MyBatis的@Param注解, 但這種方式會增加用戶使用的負擔(畢竟需要多添加一個注解…).
2. 方法參數映射功能增強
在有了@Param注解后, 就可以可以參考Spring MVC的@RequestParam:
作出更強大的功能(如參數默認值、參數別名、類型校驗等).
3. RPC(如Dubbo)轉HTTP
我們的目標是將Touch做到完善、簡潔且高性能, 這樣就可以用作一個通用的RPC轉HTTP的工具, 我們只需編寫業務代碼, 把想要開放http調用的方法前添加@Touch注解, 不需再使用Web層代碼對Service做一層包裝.
參考
- Javassist獲取字節碼代碼主要參考一下兩篇文章:
- 用 Javassist 獲取方法參數名
- Java動態編程初探——Javassist
- 動態獲取泛型參數可以參考
- Java 反射 (by 翡青)
總結
以上是生活随笔為你收集整理的Touch 方法属性 映射工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vb6中使text控件的光标随着增加的内
- 下一篇: 今天偷闲整下博客