用spring-mvc接受移动端图片上传

一开始想到使用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")    转发映射关系

相关文章
相关标签/搜索