ソースを参照

支持转换 json 数组为 List<Xxx>

James 3 年 前
コミット
90efc20ceb

+ 38 - 2
src/main/java/com/jfinal/core/paragetter/BeanGetter.java

@@ -15,6 +15,9 @@
  */
 package com.jfinal.core.paragetter;
 
+import java.lang.reflect.Parameter;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
 import com.jfinal.core.Action;
 import com.jfinal.core.Controller;
 
@@ -22,9 +25,29 @@ public class BeanGetter<T> extends ParaGetter<T> {
 	
 	private final Class<T> beanClass;
 	
-	public BeanGetter(Class<T> beanClass, String parameterName) {
+	// 存放参数泛型,支持将 json 数组转化为带有泛型的 List,例如: List<User>、List<Integer>
+	private final Class<?> parameterizedType;
+	
+	public BeanGetter(Class<T> beanClass, String parameterName, Parameter parameter) {
 		super(parameterName, null);
 		this.beanClass = beanClass;
+		this.parameterizedType = getParameterizedType(parameter); 
+	}
+	
+	private Class<?> getParameterizedType(Parameter parameter) {
+		Type type = parameter.getParameterizedType();
+		if (type instanceof ParameterizedType) {
+			Type[] ts = ((ParameterizedType)type).getActualTypeArguments();
+			if (ts != null && ts.length > 0) {
+				try {
+					return Class.forName(ts[0].getTypeName());
+				} catch (ClassNotFoundException e) {
+					return null;
+				}
+			}
+		}
+		
+		return null;
 	}
 	
 	@Override
@@ -40,7 +63,7 @@ public class BeanGetter<T> extends ParaGetter<T> {
 	private T resolveJson(JsonRequest req) {
 		com.alibaba.fastjson.JSONObject jsonObj = req.getJSONObject();
 		if (jsonObj == null) {
-			return null;
+			return toList(req.getJSONArray());
 		}
 		
 		String paraName = this.getParameterName();
@@ -53,6 +76,19 @@ public class BeanGetter<T> extends ParaGetter<T> {
 		}
 	}
 	
+	@SuppressWarnings("unchecked")
+	private T toList(com.alibaba.fastjson.JSONArray jsonArr) {
+		if (jsonArr == null) {
+			return null;
+		}
+		
+		if (parameterizedType != null) {
+			return (T) jsonArr.toJavaList(parameterizedType);
+		} else {
+			return (T) jsonArr.toJavaList(Object.class);
+		}
+	}
+	
 	@Override
 	protected T to(String v) {
 		return null;

+ 2 - 2
src/main/java/com/jfinal/core/paragetter/ParaProcessorBuilder.java

@@ -133,11 +133,11 @@ public class ParaProcessorBuilder {
 			return new EnumGetter(typeClass,parameterName,defaultValue);
 		}else if (com.jfinal.plugin.activerecord.IBean.class.isAssignableFrom(typeClass)) {
 			//实现了IBean接口,优先按BeanGetter来处理。
-			return new BeanGetter(typeClass, parameterName);
+			return new BeanGetter(typeClass, parameterName, p);
 		}else if (com.jfinal.plugin.activerecord.Model.class.isAssignableFrom(typeClass)) {
 			return new ModelGetter(typeClass, parameterName);
 		} else {
-			return new BeanGetter(typeClass, parameterName);
+			return new BeanGetter(typeClass, parameterName, p);
 		}
 	}