action参数注入,支持原生类型数组,List,Set,Map

使用方:

//因为泛型的运行期擦除,List,Set,Map 都只支持String 类型
public void arr(int a, String b, int[] c, List<String> d, Set<String> e, Map<String, String> f) {
    OK(c);
}


实现方式,在自己的MyController中:

/**
 * 覆盖父类的action参数注入方法,支持 数组,List,Set,Map传递
 * @param beanClass
 * @param beanName
 * @param skipConvertError
 * @param <T>
 * @return
 */
public <T> T getBean(Class<T> beanClass, String beanName, boolean skipConvertError) {
   HttpServletRequest request = getRequest();
   if (beanClass.isArray())
      return createParam2Array(beanClass, beanName, request);
   if (beanClass.isInterface())
      return createParam2Interface(beanClass, beanName, request);

   return super.getBean(beanClass, beanName, skipConvertError);
}


其它工具方法:

protected static <T> T createParam2Array(Class<T> beanClass, String beanName, HttpServletRequest request) {
   String[] vs = getParamValues(beanName, request);
   if (vs == null || vs.length == 0)
      return null;
   Class elemType = beanClass.getComponentType();
   Object p = Array.newInstance(elemType, vs.length);
   for (int i = 0; i < vs.length; i++) {
      Object elmv = cover2Type(vs[i].trim(), elemType);
      Array.set(p, i, elmv);
   }
   return (T) p;
}

protected static <T> T createParam2Interface(Class<T> beanClass, String beanName, HttpServletRequest request) {
   Object p = null;
   if(beanClass == List.class || beanClass == Set.class){
      String[] vs = getParamValues(beanName, request);
      if (vs == null || vs.length == 0)
         return null;
      if (beanClass == List.class) {
         p = new ArrayList();
         List pp = (List) p;
         for (int i = 0; i < vs.length; i++) {
            pp.add(vs[i].trim());
         }
      }
      if (beanClass == Set.class) {
         p = new HashSet();
         Set pp = (Set) p;
         for (int i = 0; i < vs.length; i++) {
            pp.add(vs[i].trim());
         }
      }

   }else if (beanClass == Map.class) {
      String json = request.getParameter(beanName);
      p = JSON.parseObject(json, LinkedHashMap.class);
   }
   return (T) p;
}

protected static String[] getParamValues(String pname, HttpServletRequest request) {
   String[] vs = request.getParameterValues(pname);
   if (vs == null || vs.length == 0) {
      //兼容ajax调用时的数组方式
      vs = request.getParameterValues(pname + "[]");
   } else {
      vs = vs[0].split(",");
   }
   if (vs == null || vs.length == 0)
      return null;
   return vs;
}

protected static Object cover2Type(String v, Class objType) {
   if (objType == int.class || objType == Integer.class)
      return Integer.valueOf(v);
   if (objType == boolean.class || objType == Boolean.class)
      return Boolean.valueOf(v);
   if (objType == Date.class)
      return new Date(v);

   if (objType == float.class || objType == Float.class)
      return Float.valueOf(v);
   if (objType == long.class || objType == Long.class)
      return Long.valueOf(v);
   if (objType == double.class || objType == Double.class)
      return Double.valueOf(v);

   if (objType == BigDecimal.class)
      return new BigDecimal(v);
   if (objType == BigInteger.class)
      return new BigInteger(v);
   return null;
}


评论区

JFinal

2019-04-22 09:16

这回代码简洁好看了,感谢你的分享

原有的贴子其实可以随时修改,也可以删除

快乐的蹦豆子

2019-04-22 09:20

不错哦

热门分享

扫码入社