今天,上班寫接口的時候,和同事討論,json
是否全部接口能調用同一個地址,經過key做爲參數,把模塊名和方法名傳入,把模塊名稱和方法名經過反射機制,獲取到對應模塊名下的方法,經過對應的參數返回想要的結果session
討論下來,發現貌似是能夠的,說作就作,先寫個Demoapp
傳入json:this
{ "action": "UserWebService-login", "timestamp": "1452223478", "gsonValue": "", "appkey": "123", "nonceStr": "06e2fe8b-1e33-4a80-bdc3-4055b1459388", "signature": "3886041eb6336b6f190cc298fb83ce63", "content": { "C_ACCOUNTNAME": "kate", "C_PASSWORD": "1" } }
action就是這個模塊名和方法名的結合UserWebService-loginspa
模塊UserWebService,方法login日誌
經過這個key,還有對應的參數,請求UserWebService下的login,返回對應的結果集code
1 @Resource 2 HttpServletRequest request; 3 4 public Object UserWebService(ModleForm form,HttpServletRequest req) throws Exception{ 5 return returnMethodValue(form, req, UserWebService.class,userWebService); 6 } 7 8 /** 9 * @Title: returnMethodValue 10 * @Description: TODO(經過json,獲取方法名,獲取接口數據) 11 * @param: @param form 12 * @param: @param req 13 * @param: @param clazz 14 * @param: @return 15 * @param: @throws Exception 16 * @return: Object 17 * @throws 18 */ 19 public Object returnMethodValue(ModleForm form,HttpServletRequest req,Class<?> clazz) throws Exception{ 20 JSONObject jsonObject = new JSONObject(form.getJson()); 21 String action = (String) jsonObject.get("action"); 22 String Method = (String) StringUtils.returnObjectByLength(StringUtils.toSpilt(action, "-"),1); 23 Method actionMethod = clazz.getMethod(Method,ModleForm.class,HttpServletRequest.class); 24 Object object = actionMethod.invoke(clazz.getClass().newInstance(), form , req); 25 return object; 26 } 27 28 29 public Map<String,Object> getMapByObject(Object object){ 30 Map<String,Object> map = (Map<String, Object>) object; 31 return map; 32 } 33 34 35 @ResponseBody 36 @RequestMapping(value = "/mobile_user/entrance") 37 public String entrance() { 38 Object object = null; 39 String json = request.getParameter("json"); 40 JSONObject jsonObject = new JSONObject(json); 41 ModleForm modleForm = new ModleForm(); 42 modleForm.setJson(json); 43 Map<String,Object> map = new HashMap<String, Object>(); 44 //驗證 45 boolean flag = Verification(json); 46 //返回錯誤碼 47 map = getErrorCode(flag,new ModleForm()); 48 try { 49 String action = (String) jsonObject.get("action"); 50 List<Object> list = StringUtils.toSpilt(action, "-"); 51 String Modular = (String) StringUtils.returnObjectByLength(list,0); 52 53 Method MobileMethod = MobileWebService.class.getMethod(Modular,ModleForm.class,HttpServletRequest.class); 54 object = MobileMethod.invoke(MobileWebService.class.newInstance(), modleForm , request); 55 map = getMapByObject(object); 56 } catch (Exception e) { 57 // TODO Auto-generated catch block 58 e.printStackTrace(); 59 map = this.returnErrorCode(new ModleForm().getComponentId()+"-1101", getMesssage(new ModleForm().getComponentId()+"-1101")); 60 return gsonUtils.toJson(map); 61 } 62 return gsonUtils.toJson(map); 63 }
可是,重點來了,由於是用的SpringMVCorm
MobileMethod.invoke(MobileWebService.class.newInstance(), modleForm , request);
Object object = actionMethod.invoke(clazz.getClass().newInstance(), form , req);
這樣寫,手動new一個對象,SpringMVC是不會根據這個對象,依賴注入後面的service,dao之類的東西的,而個人UserWebService中就有對應的service須要依賴注入!
怎麼辦呢,嘗試了各類辦法,找資料,忽然想到@Resource:
@Resource 註解被用來激活一個命名資源(named resource)的依賴注入,在JavaEE應用程序中,該註解被典型地轉換爲綁定於JNDI context中的一個對象。 Spring確實支持使用@Resource經過JNDI lookup來解析對象,默認地,擁有與@Resource註解所提供名字相匹配的「bean name(bean名字)」的Spring管理對象會被注入。 在下面的例子中,Spring會向加了註解的setter方法傳遞bean名爲「dataSource」的Spring管理對象的引用。
他能夠幫助咱們來依賴注入,那是否是我能夠不去手動new一個對象呢,說來就來
1 @Resource 2 MobileWebService mobileWebService; 3 4 5 @Resource 6 UserWebService userWebService; 7 8 9 10 @Resource 11 HttpServletRequest request; 12 13 public Object UserWebService(ModleForm form,HttpServletRequest req) throws Exception{ 14 return returnMethodValue(form, req, UserWebService.class,userWebService); 15 } 16 17 /** 18 * @Title: returnMethodValue 19 * @Description: TODO(經過json,獲取方法名,獲取接口數據) 20 * @param: @param form 21 * @param: @param req 22 * @param: @param clazz 23 * @param: @return 24 * @param: @throws Exception 25 * @return: Object 26 * @throws 27 */ 28 public Object returnMethodValue(ModleForm form,HttpServletRequest req,Class<?> clazz,Object classObject) throws Exception{ 29 JSONObject jsonObject = new JSONObject(form.getJson()); 30 String action = (String) jsonObject.get("action"); 31 String Method = (String) StringUtils.returnObjectByLength(StringUtils.toSpilt(action, "-"),1); 32 Method actionMethod = clazz.getMethod(Method,ModleForm.class,HttpServletRequest.class); 33 Object object = actionMethod.invoke(classObject, form , req); 34 return object; 35 } 36 37 38 public Map<String,Object> getMapByObject(Object object){ 39 Map<String,Object> map = (Map<String, Object>) object; 40 return map; 41 } 42 43 44 @ResponseBody 45 @RequestMapping(value = "/mobile_user/entrance") 46 public String entrance() { 47 Object object = null; 48 String json = request.getParameter("json"); 49 JSONObject jsonObject = new JSONObject(json); 50 ModleForm modleForm = new ModleForm(); 51 modleForm.setJson(json); 52 Map<String,Object> map = new HashMap<String, Object>(); 53 //驗證 54 boolean flag = Verification(json); 55 //返回錯誤碼 56 map = getErrorCode(flag,new ModleForm()); 57 try { 58 String action = (String) jsonObject.get("action"); 59 List<Object> list = StringUtils.toSpilt(action, "-"); 60 String Modular = (String) StringUtils.returnObjectByLength(list,0); 61 62 Method MobileMethod = MobileWebService.class.getMethod(Modular,ModleForm.class,HttpServletRequest.class); 63 object = MobileMethod.invoke(mobileWebService, modleForm , request); 64 map = getMapByObject(object);//轉成map 65 } catch (Exception e) { 66 // TODO Auto-generated catch block 67 e.printStackTrace(); 68 map = this.returnErrorCode(new ModleForm().getComponentId()+"-1101", getMesssage(new ModleForm().getComponentId()+"-1101")); 69 return gsonUtils.toJson(map); 70 } 71 return gsonUtils.toJson(map); 72 }
這樣的話,咱們的反射機制和依賴注入就完成了,全部的接口都經過這個入口對象
http://localhost:8080/xxx/mobile_user/entrance.bk?json={"action":"UserWebService-login","timestamp":"1452223478","gsonValue":"","appkey":"123","nonceStr":"06e2fe8b-1e33-4a80-bdc3-4055b1459388","signature":"3886041eb6336b6f190cc298fb83ce63","content":{"C_ACCOUNTNAME":"kate","C_PASSWORD":"1"}}返回我想要的結果這樣作的好處呢是:對應的,個人工做量就變小了,在入口處寫 接口日誌,獲取session信息,返回錯誤碼,接口驗證我都能在一個地方完成,而不須要在每個Controller對應的方法裏面寫不少相似的代碼,個人方法中只須要寫相關邏輯