Skip to content

Commit 3008904

Browse files
committed
fix 修复Http Get参数读取数组的问题
1 parent d0ba772 commit 3008904

File tree

5 files changed

+111
-123
lines changed

5 files changed

+111
-123
lines changed

common/src/main/java/org/beifengtz/jvmm/common/util/ReflexUtil.java

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class ReflexUtil {
2828
/**
2929
* 从包package中获取所有的Class
3030
*
31-
* @param pack 包地址
31+
* @param pack 包地址
3232
* @param recursive 是否递归搜索
3333
* @return Class集合
3434
*/
@@ -88,8 +88,8 @@ public static Set<Class<?>> getClasses(String pack, boolean recursive) {
8888
*
8989
* @param packageName 包名
9090
* @param packagePath 包路径
91-
* @param recursive 是否递归搜索
92-
* @param classes 类集合,搜索后会存进此集合
91+
* @param recursive 是否递归搜索
92+
* @param classes 类集合,搜索后会存进此集合
9393
*/
9494
public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive,
9595
Set<Class<?>> classes) {
@@ -150,7 +150,7 @@ public static Set<Method> scanMethodAnnotation(String pack, Class<? extends Anno
150150
/**
151151
* 从某个类中扫描被注解有 annotation 的方法
152152
*
153-
* @param clazz 类
153+
* @param clazz
154154
* @param annotation 注解类
155155
* @return 方法集合
156156
*/
@@ -177,4 +177,41 @@ public static Set<Method> scanMethodAnnotation(Set<Class<?>> classes, Class<? ex
177177
}
178178
return result;
179179
}
180+
181+
@SuppressWarnings("unchecked")
182+
public static Object parseValueFromStr(Class<?> type, String source) {
183+
if (source == null) {
184+
return null;
185+
}
186+
if (type.isAssignableFrom(String.class)) {
187+
return source;
188+
} else if (type.isAssignableFrom(short.class)) {
189+
return Short.parseShort(source);
190+
} else if (type.isAssignableFrom(Short.class)) {
191+
return Short.valueOf(source);
192+
} else if (type.isAssignableFrom(int.class)) {
193+
return Integer.parseInt(source);
194+
} else if (type.isAssignableFrom(Integer.class)) {
195+
return Integer.valueOf(source);
196+
} else if (type.isAssignableFrom(float.class)) {
197+
return Float.parseFloat(source);
198+
} else if (type.isAssignableFrom(Float.class)) {
199+
return Float.valueOf(source);
200+
} else if (type.isAssignableFrom(double.class)) {
201+
return Double.parseDouble(source);
202+
} else if (type.isAssignableFrom(Double.class)) {
203+
return Double.valueOf(source);
204+
} else if (type.isAssignableFrom(boolean.class)) {
205+
return Boolean.parseBoolean(source);
206+
} else if (type.isAssignableFrom(Boolean.class)) {
207+
return Boolean.valueOf(source);
208+
} else if (type.isAssignableFrom(long.class)) {
209+
return Long.parseLong(source);
210+
} else if (type.isAssignableFrom(Long.class)) {
211+
return Long.valueOf(source);
212+
} else if (type.isAssignableFrom(Enum.class)) {
213+
return Enum.valueOf((Class<? extends Enum>) type, source);
214+
}
215+
return null;
216+
}
180217
}

convey/src/main/java/org/beifengtz/jvmm/convey/handler/HttpChannelHandler.java

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,18 @@
3737

3838
import java.io.UnsupportedEncodingException;
3939
import java.lang.annotation.Annotation;
40+
import java.lang.reflect.Array;
4041
import java.lang.reflect.InvocationTargetException;
4142
import java.lang.reflect.Method;
4243
import java.lang.reflect.Modifier;
4344
import java.net.URI;
4445
import java.net.URISyntaxException;
4546
import java.net.URLDecoder;
4647
import java.nio.charset.StandardCharsets;
48+
import java.sql.Ref;
49+
import java.util.ArrayList;
4750
import java.util.HashMap;
51+
import java.util.List;
4852
import java.util.Map;
4953
import java.util.Set;
5054
import java.util.concurrent.ConcurrentHashMap;
@@ -168,7 +172,7 @@ protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest msg) thro
168172
return;
169173
}
170174
try {
171-
Map<String, String> params = loadParam(pair.getLeft());
175+
Map<String, Object> params = loadParam(pair.getLeft());
172176

173177
boolean keepHandle = handleBefore(ctx, pair.getRight(), msg);
174178
if (!keepHandle) {
@@ -206,21 +210,21 @@ protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest msg) thro
206210
} else if (anno.annotationType() == RequestParam.class) {
207211
RequestParam rp = (RequestParam) anno;
208212
String key = "".equals(rp.value()) ? method.getParameters()[i].getName() : rp.value();
209-
String value = params.get(key);
210-
if (parameterType.isAssignableFrom(String.class)) {
211-
parameter[i] = value;
212-
} else if (parameterType.isAssignableFrom(int.class)) {
213-
parameter[i] = Integer.parseInt(value);
214-
} else if (parameterType.isAssignableFrom(double.class)) {
215-
parameter[i] = Double.parseDouble(value);
216-
} else if (parameterType.isAssignableFrom(boolean.class)) {
217-
parameter[i] = Boolean.parseBoolean(value);
218-
} else if (parameterType.isAssignableFrom(long.class)) {
219-
parameter[i] = Long.parseLong(value);
220-
} else if (parameterType.isAssignableFrom(Enum.class)) {
221-
parameter[i] = Enum.valueOf((Class<? extends Enum>) parameterType, value);
213+
Object value = params.get(key);
214+
215+
if (parameterType.isArray()) {
216+
List<String> valueArr = (List<String>) params.get(key + "[]");
217+
Class<?> componentType = parameterType.getComponentType();
218+
Object array = Array.newInstance(componentType, valueArr.size());
219+
for (int j = 0; j < valueArr.size(); j++) {
220+
Array.set(array, j, ReflexUtil.parseValueFromStr(componentType, valueArr.get(j)));
221+
}
222+
parameter[i] = array;
222223
} else {
223-
parameter[i] = new Gson().fromJson(value, parameterType);
224+
parameter[i] = ReflexUtil.parseValueFromStr(parameterType, (String) value);
225+
if (parameter[i] == null) {
226+
parameter[i] = new Gson().fromJson(value.toString(), parameterType);
227+
}
224228
}
225229
}
226230
}
@@ -267,9 +271,10 @@ protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest msg) thro
267271
}
268272
}
269273

270-
private Map<String, String> loadParam(URI uri) throws UnsupportedEncodingException {
274+
@SuppressWarnings("unchecked")
275+
private Map<String, Object> loadParam(URI uri) throws UnsupportedEncodingException {
271276
String query = uri.getQuery();
272-
Map<String, String> params = new HashMap<>();
277+
Map<String, Object> params = new HashMap<>();
273278
if (query == null) {
274279
return params;
275280
}
@@ -279,10 +284,16 @@ private Map<String, String> loadParam(URI uri) throws UnsupportedEncodingExcepti
279284
continue;
280285
}
281286
String[] kv = str.split("=");
282-
if (kv.length > 1) {
283-
params.put(kv[0], URLDecoder.decode(kv[1], "UTF-8"));
287+
if (kv.length <= 1) {
288+
continue;
289+
}
290+
String key = kv[0];
291+
String value = URLDecoder.decode(kv[1], "UTF-8");
292+
if (key.endsWith("[]")) {
293+
List<String> array = (List<String>) params.computeIfAbsent(key, o -> new ArrayList<>());
294+
array.add(value);
284295
} else {
285-
params.put(kv[0], "");
296+
params.put(key, value);
286297
}
287298
}
288299
return params;

0 commit comments

Comments
 (0)