浏览代码

优化改进参数注入支持Map、List<XXX>、XXX[]、Kv等

sdxiaomu 1 年之前
父节点
当前提交
9f1c18075f

+ 12 - 0
src/main/java/com/jfinal/core/paragetter/BeanGetter.java

@@ -18,6 +18,9 @@ package com.jfinal.core.paragetter;
 import java.lang.reflect.Parameter;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Map;
+
 import com.jfinal.core.Action;
 import com.jfinal.core.ActionHandler;
 import com.jfinal.core.Controller;
@@ -70,9 +73,18 @@ public class BeanGetter<T> extends ParaGetter<T> {
 	private T toBean(com.alibaba.fastjson.JSONObject jsonObj) {
 		String paraName = this.getParameterName();
 		if (jsonObj.containsKey(paraName)) {
+			if(List.class.isAssignableFrom(beanClass)){
+				return toList(jsonObj.getJSONArray(paraName));
+			}else if(Map.class.isAssignableFrom(beanClass)){
+				return jsonObj.getJSONObject(paraName).toJavaObject(beanClass);
+			}
 			// 存在与 action 形参名相同的 request 参数则使用其 value 值进行转换
 			return jsonObj.getObject(paraName, beanClass);
 		} else {
+			//如果不是集合、数组、Map,则返回 null
+			if(List.class.isAssignableFrom(beanClass) || beanClass.isArray() || Map.class.isAssignableFrom(beanClass)){
+				return null;
+			}
 			// 否则使用整个请求中的 json 进行转换
 			return jsonObj.toJavaObject(beanClass);
 		}

+ 24 - 3
src/main/java/com/jfinal/core/paragetter/IntegerArrayGetter.java

@@ -18,20 +18,41 @@ package com.jfinal.core.paragetter;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.alibaba.fastjson.JSONObject;
 import com.jfinal.core.Action;
+import com.jfinal.core.ActionHandler;
 import com.jfinal.core.Controller;
 import com.jfinal.kit.StrKit;
 
 public class IntegerArrayGetter extends ParaGetter<Integer[]> {
-	
+
 	public IntegerArrayGetter(String parameterName, String defaultValue) {
 		super(parameterName,defaultValue);
 	}
 
 	@Override
 	public Integer[] get(Action action, Controller c) {
-		Integer[] ret = c.getParaValuesToInt(getParameterName());
-		if( null == ret) {
+		String paraName = getParameterName();
+		Integer[] ret = null;
+		if (ActionHandler.resolveJson && c.isJsonRequest()) {
+			JsonRequest jsonRequest = (JsonRequest) c.getRequest();
+			JSONObject jsonObject = jsonRequest.getJSONObject();
+			if(jsonObject != null && !jsonObject.isEmpty() && jsonObject.containsKey(paraName)){
+				Object values = jsonObject.get(paraName);
+				if(values !=null){
+					if(values instanceof String){
+						ret = to(values.toString());
+					}else if(values instanceof List){
+						ret = ((List<Integer>)values).toArray(new Integer[0]);
+					}else if(values instanceof String[]){
+						ret = (Integer[])values;
+					}
+				}
+			}
+		}else{
+			ret = c.getParaValuesToInt(paraName);
+		}
+		if(null == ret) {
 			ret =  this.getDefaultValue();
 		}
 		return ret;

+ 63 - 0
src/main/java/com/jfinal/core/paragetter/KvGetter.java

@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2011-2023, 玛雅牛 (myaniu AT gmail.com).
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.jfinal.core.paragetter;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.jfinal.core.Action;
+import com.jfinal.core.ActionHandler;
+import com.jfinal.core.Controller;
+import com.jfinal.kit.Kv;
+import com.jfinal.kit.StrKit;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+public class KvGetter extends ParaGetter<Kv> {
+
+	public KvGetter(String parameterName, String defaultValue){
+		super(parameterName, defaultValue);
+	}
+
+	@Override
+	public Kv get(Action action, Controller c) {
+		String paraName = getParameterName();
+		Kv ret = null;
+		if (ActionHandler.resolveJson && c.isJsonRequest()) {
+			JsonRequest jsonRequest = (JsonRequest) c.getRequest();
+			JSONObject jsonObject = jsonRequest.getJSONObject();
+			if(jsonObject != null && !jsonObject.isEmpty() && jsonObject.containsKey(paraName)){
+				ret = Kv.create().set(jsonObject.getJSONObject(paraName).getInnerMap());
+			}
+		}else{
+			ret = to(c.getPara(paraName));
+		}
+		if(null == ret) {
+			ret =  this.getDefaultValue();
+		}
+		return ret;
+	}
+
+	@Override
+	protected Kv to(String v) {
+		if(StrKit.notBlank(v)){
+			return Kv.create().set(JSON.parseObject(v).getInnerMap());
+		}
+		return null;
+	}
+}

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

@@ -18,7 +18,9 @@ package com.jfinal.core.paragetter;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.alibaba.fastjson.JSONObject;
 import com.jfinal.core.Action;
+import com.jfinal.core.ActionHandler;
 import com.jfinal.core.Controller;
 import com.jfinal.kit.StrKit;
 
@@ -30,8 +32,27 @@ public class LongArrayGetter extends ParaGetter<Long[]> {
 
 	@Override
 	public Long[] get(Action action, Controller c) {
-		Long[] ret =  c.getParaValuesToLong(getParameterName());
-		if( null == ret) {
+		String paraName = getParameterName();
+		Long[] ret = null;
+		if (ActionHandler.resolveJson && c.isJsonRequest()) {
+			JsonRequest jsonRequest = (JsonRequest) c.getRequest();
+			JSONObject jsonObject = jsonRequest.getJSONObject();
+			if(jsonObject != null && !jsonObject.isEmpty() && jsonObject.containsKey(paraName)){
+				Object values = jsonObject.get(paraName);
+				if(values !=null){
+					if(values instanceof String){
+						ret =to(values.toString());
+					}else if(values instanceof List){
+						ret = ((List<Long>)values).toArray(new Long[0]);
+					}else if(values instanceof String[]){
+						ret = (Long[])values;
+					}
+				}
+			}
+		}else{
+			ret = c.getParaValuesToLong(paraName);
+		}
+		if(null == ret) {
 			ret =  this.getDefaultValue();
 		}
 		return ret;

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

@@ -55,11 +55,12 @@ public class ParaProcessorBuilder {
 		regist(java.lang.Integer[].class, IntegerArrayGetter.class, null);
 		regist(java.lang.Long[].class, LongArrayGetter.class, null);
 		regist(com.jfinal.core.paragetter.RawData.class, RawDataGetter.class, null);
-		
+		regist(com.jfinal.kit.Kv.class, KvGetter.class, null);
+
 	}
-	
+
 	/**
-	 * 注册一个类型对应的参数获取器 
+	 * 注册一个类型对应的参数获取器
 	 * ParameterGetterBuilder.me().regist(java.lang.String.class, StringParaGetter.class, null);
 	 * @param typeClass 类型,例如 java.lang.Integer.class
 	 * @param pgClass 参数获取器实现类,必须继承ParaGetter
@@ -71,20 +72,20 @@ public class ParaProcessorBuilder {
 
 	public ParaProcessor build(Class<? extends Controller> controllerClass, Method method) {
 		final int paraCount = method.getParameterCount();
-		
+
 		// 无参 action 共享同一个对象,该分支以外的所有 ParaProcessor 都是有参 action,不必进行 null 值判断
 		if (paraCount == 0) {
 			return NullParaProcessor.me;
 		}
-		
+
 		ParaProcessor ret = new ParaProcessor(paraCount);
-		
+
 		Parameter[] paras = method.getParameters();
 		for (int i=0; i<paraCount; i++) {
 			IParaGetter<?> pg = createParaGetter(controllerClass, method, paras[i]);
 			ret.addParaGetter(i, pg);
 		}
-		
+
 		return ret;
 	}
 
@@ -105,7 +106,7 @@ public class ParaProcessorBuilder {
 			if (!Para.NULL_VALUE.equals(para.value())) {
 				parameterName = para.value().trim();
 			}
-			
+
 			/*
 			defaultValue = para.defaultValue().trim();
 			if (defaultValue.isEmpty()) {
@@ -115,7 +116,7 @@ public class ParaProcessorBuilder {
 			if (!Para.NULL_VALUE.equals(para.defaultValue())) {
 				defaultValue = para.defaultValue();
 			}
-			
+
 		}
 		Holder holder = typeMap.get(typeClass);
 		if (holder != null) {

+ 26 - 3
src/main/java/com/jfinal/core/paragetter/StringArrayGetter.java

@@ -15,19 +15,42 @@
  */
 package com.jfinal.core.paragetter;
 
+import com.alibaba.fastjson.JSONObject;
 import com.jfinal.core.Action;
+import com.jfinal.core.ActionHandler;
 import com.jfinal.core.Controller;
 import com.jfinal.kit.StrKit;
 
+import java.util.List;
+
 public class StringArrayGetter extends ParaGetter<String[]> {
-	
+
 	public StringArrayGetter(String parameterName, String defaultValue) {
 		super(parameterName,defaultValue);
 	}
 	@Override
 	public String[] get(Action action, Controller c) {
-		String[] ret = c.getParaValues(getParameterName());
-		if( null == ret) {
+		String paraName = getParameterName();
+		String[] ret = null;
+		if (ActionHandler.resolveJson && c.isJsonRequest()) {
+			JsonRequest jsonRequest = (JsonRequest) c.getRequest();
+			JSONObject jsonObject = jsonRequest.getJSONObject();
+			if(jsonObject != null && !jsonObject.isEmpty() && jsonObject.containsKey(paraName)){
+				Object values = jsonObject.get(paraName);
+				if(values !=null){
+					if(values instanceof String){
+						ret = to(values.toString());
+					}else if(values instanceof List){
+						ret = ((List<String>)values).toArray(new String[0]);
+					}else if(values instanceof String[]){
+						ret = (String[])values;
+					}
+				}
+			}
+		}else{
+			ret = c.getParaValues(paraName);
+		}
+		if(null == ret) {
 			ret =  this.getDefaultValue();
 		}
 		return ret;