一開始想到使用soa的形式,使用rest對外發布接口地址,想一想挺好的,但由於不熟,時間比較緊,出什麼簍子壓力就打了,java
仍是先使用spring-mvc吧,作好工做的第一件工做,哈哈spring
具體開發的時候仍是挺煩的,曲折。json
首先規定了移動端掉服務端數據的格式是這樣子的 http://ip:port/V20?{json}數組
好吧,和我一開始想的根據url直接映射到方法執行泡湯了。spring-mvc
而後先寫個路由controller,用@RequestMapping(value="V20")去接受全部的請求,從json中獲取到方法名再轉發到具體方法, 「forward:/method?json=json」 嗯,這樣子也不錯。mvc
可是移動端傳給個人是base64的數組字符串,但我把這串字符串轉發給具體執行方法的時候,oh,no不行了,參數中一些特殊字符通過轉發後變了,若是「+」號,那我直接替換那些不能識別的字符成代碼 如「+」換成 %25B。按理說確定應該能夠了,可是傳過去後仍是不對,也不知道爲何,沒深究。還想,先把圖片的base64字符串轉成byte[]傳過去,我只能說我太天真了,byte[]數組一經轉發就不同了,更況且多張圖片多個byte[],那不成byte[][]。app
最後弄得有點煩,好像用spring-mvc原先的轉發映射搞不定(確定是我本身哪一個地方沒處理好)ui
那最後的解決方法是本身寫一個路由,根據methodname找到某個action中的方法。url
在RouteController中寫了rest
private static Map<String, Object> objectMap = new HashMap<String, Object>(); private static Map<String, Method> methodMap = new HashMap<String, Method>(); static{ //找到action下的全部類 List<Class> list= ClassSearcher.findClasses(); if(list!=null&&list.isEmpty()==false){ for(Class clz:list){ Method[] ms = clz.getDeclaredMethods(); for(Method m : ms){ Object o = null; try { //從spring中獲取對象 o = SpringContextHolder.getBean(clz); } catch (Exception e) { log.error("srping容器中沒有:"+clz+"對象",e); } objectMap.put(m.getName(), o); methodMap.put(m.getName(), m); } } } log.info("初始化執行方法對象map================"+objectMap); log.info("初始化執行方法map================"+methodMap); }
而後根據json中的方法名
Object o = objectMap.get(accept.getMethod()); Method m = methodMap.get(accept.getMethod()); if(o!=null && m!=null){ Object result = m.invoke(o, new String[]{uid,source,accept.getArguments()}); return result.toString(); }else{ log.info("未找到請求的對應方法=========方法名:"+accept.getMethod()); reverse.setStatus(2); reverse.setMsg("未找到請求方法的對應方法"); return JSON.toJSONString(reverse); }
感受好簡陋,但一時間想不出好的方法,也但願大神們能指點一下。根據methodName找到controller的方法,不使用@RequestMapping(value = "/V20") 轉發映射關係