diff --git a/hsweb-commons/hsweb-commons-utils/pom.xml b/hsweb-commons/hsweb-commons-utils/pom.xml index 2b8d6e1ac..f1cffb148 100644 --- a/hsweb-commons/hsweb-commons-utils/pom.xml +++ b/hsweb-commons/hsweb-commons-utils/pom.xml @@ -60,5 +60,14 @@ hsweb-expands-script true + + commons-beanutils + commons-beanutils + + + org.hswebframework + hsweb-easy-orm-core + test + \ No newline at end of file diff --git a/hsweb-commons/hsweb-commons-utils/src/main/java/org/hswebframework/web/HttpParameterConverter.java b/hsweb-commons/hsweb-commons-utils/src/main/java/org/hswebframework/web/HttpParameterConverter.java new file mode 100644 index 000000000..69a5d6c6e --- /dev/null +++ b/hsweb-commons/hsweb-commons-utils/src/main/java/org/hswebframework/web/HttpParameterConverter.java @@ -0,0 +1,120 @@ +package org.hswebframework.web; + +import org.apache.commons.beanutils.BeanMap; +import org.hswebframework.utils.time.DateFormatter; + +import java.util.*; +import java.util.function.Function; + +public class HttpParameterConverter { + + private Map beanMap; + + private Map parameter = new HashMap<>(); + + private String prefix = ""; + + private static final Map> convertMap = new HashMap<>(); + + private static Function defaultConvert = String::valueOf; + + private static final Set basicClass = new HashSet<>(); + + static { + basicClass.add(int.class); + basicClass.add(double.class); + basicClass.add(float.class); + basicClass.add(byte.class); + basicClass.add(short.class); + basicClass.add(char.class); + basicClass.add(boolean.class); + + basicClass.add(Integer.class); + basicClass.add(Double.class); + basicClass.add(Float.class); + basicClass.add(Byte.class); + basicClass.add(Short.class); + basicClass.add(Character.class); + basicClass.add(String.class); + basicClass.add(Boolean.class); + + basicClass.add(Date.class); + + + putConvert(Date.class, (date) -> DateFormatter.toString(date, "yyyy-MM-dd HH:mm:ss")); + + + } + + @SuppressWarnings("unchecked") + private static void putConvert(Class type, Function convert) { + convertMap.put(type, (Function) convert); + + } + + private String convertValue(Object value) { + return convertMap.getOrDefault(value.getClass(), defaultConvert).apply(value); + } + + @SuppressWarnings("unchecked") + public HttpParameterConverter(Object bean) { + if (bean instanceof Map) { + beanMap = ((Map) bean); + } else { + beanMap = new HashMap<>((Map) new BeanMap(bean)); + beanMap.remove("class"); + beanMap.remove("declaringClass"); + } + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + } + + private void doConvert(String key, Object value) { + if (value == null) { + return; + } + if(value instanceof Class){ + return; + } + Class type = org.springframework.util.ClassUtils.getUserClass(value); + + if (basicClass.contains(type) || value instanceof Number || value instanceof Enum) { + parameter.put(getParameterKey(key), convertValue(value)); + return; + } + + if (value instanceof Object[]) { + value = Arrays.asList(((Object[]) value)); + } + + if (value instanceof Collection) { + Collection coll = ((Collection) value); + int count = 0; + for (Object o : coll) { + doConvert(key + "[" + count++ + "]", o); + } + } else { + HttpParameterConverter converter = new HttpParameterConverter(value); + converter.setPrefix(getParameterKey(key).concat(".")); + parameter.putAll(converter.convert()); + } + } + + private void doConvert() { + beanMap.forEach(this::doConvert); + } + + + private String getParameterKey(String property) { + return prefix.concat(property); + } + + public Map convert() { + doConvert(); + + return parameter; + } + +} diff --git a/hsweb-commons/hsweb-commons-utils/src/main/java/org/hswebframework/web/WebUtil.java b/hsweb-commons/hsweb-commons-utils/src/main/java/org/hswebframework/web/WebUtil.java index 2e85e1e52..f837a58eb 100644 --- a/hsweb-commons/hsweb-commons-utils/src/main/java/org/hswebframework/web/WebUtil.java +++ b/hsweb-commons/hsweb-commons-utils/src/main/java/org/hswebframework/web/WebUtil.java @@ -35,6 +35,19 @@ import java.util.Map; */ public class WebUtil { + /** + * 将对象转为http请求参数: + *
+     *     {name:"test",org:[1,2,3]} => {"name":"test","org[0]":1,"org[1]":2,"org[2]":3}
+     * 
+ * + * @param object + * @return + */ + public static Map objectToHttpParameters(Object object) { + return new HttpParameterConverter(object).convert(); + } + /** * 尝试获取当前请求的HttpServletRequest实例 * diff --git a/hsweb-commons/hsweb-commons-utils/src/test/java/org/hswebframework/web/HttpParameterConverterTests.java b/hsweb-commons/hsweb-commons-utils/src/test/java/org/hswebframework/web/HttpParameterConverterTests.java new file mode 100644 index 000000000..f74d178cf --- /dev/null +++ b/hsweb-commons/hsweb-commons-utils/src/test/java/org/hswebframework/web/HttpParameterConverterTests.java @@ -0,0 +1,90 @@ +package org.hswebframework.web; + +import org.hswebframework.ezorm.core.dsl.Query; +import org.hswebframework.ezorm.core.param.QueryParam; +import org.junit.Assert; +import org.junit.Test; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.*; + +public class HttpParameterConverterTests { + + @Test + public void testConvertMap() { + Map target = new HashMap<>(); + + Map info = new HashMap<>(); + info.put("nickName", "小宋"); + info.put("address", "重庆"); + + + Map loginInfo = new HashMap<>(); + loginInfo.put("lastLoginIp", "127.0.0.1"); + loginInfo.put("lastLoginTime", new Date()); + loginInfo.put("lastLoginIp5Times", Arrays.asList("127.0.0.1", "localhost")); + + info.put("loginInfo", loginInfo); + + target.put("name", "admin"); + target.put("age", 30); + target.put("money", new BigDecimal("1000000.00")); + target.put("createDate", new Date()); + target.put("roles", Arrays.asList(1, 2, 3)); + target.put("info", info); + + HttpParameterConverter converter = new HttpParameterConverter(target); + + Map result = converter.convert(); + + System.out.println(result); + + Assert.assertEquals(result.get("roles[0]"), "1"); + Assert.assertEquals(result.get("roles[1]"), "2"); + Assert.assertEquals(result.get("roles[2]"), "3"); + Assert.assertEquals(result.get("name"), "admin"); + Assert.assertEquals(result.get("info.nickName"), "小宋"); + Assert.assertEquals(result.get("info.address"), "重庆"); + + Assert.assertEquals(result.get("info.loginInfo.lastLoginIp"), "127.0.0.1"); + Assert.assertEquals(result.get("info.loginInfo.lastLoginIp5Times[0]"), "127.0.0.1"); + Assert.assertEquals(result.get("info.loginInfo.lastLoginIp5Times[1]"), "localhost"); + + } + + @Test + public void testConvertObject() { + QueryParam param = Query.empty(new QueryParam()) + .where("name", "张三") + .and().like("address", "%重庆%") + .nest() + .lt("age", 18) + .or() + .gt("age", 60) + .end() + .getParam(); + + HttpParameterConverter converter = new HttpParameterConverter(param); + + Map result = converter.convert(); + + System.out.println(result); + + Assert.assertEquals(result.get("terms[0].column"), "name"); + Assert.assertEquals(result.get("terms[0].value"), "张三"); + + Assert.assertEquals(result.get("terms[1].termType"), "like"); + Assert.assertEquals(result.get("terms[1].value"), "%重庆%"); + + Assert.assertEquals(result.get("terms[2].terms[0].termType"), "lt"); + Assert.assertEquals(result.get("terms[2].terms[0].value"), "18"); + + Assert.assertEquals(result.get("terms[1].value"), "%重庆%"); + + } +} \ No newline at end of file