فهرست منبع

add HttpParameterConverter

zhou-hao 7 سال پیش
والد
کامیت
2c6eac2ff2

+ 9 - 0
hsweb-commons/hsweb-commons-utils/pom.xml

@@ -60,5 +60,14 @@
             <artifactId>hsweb-expands-script</artifactId>
             <optional>true</optional>
         </dependency>
+        <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hswebframework</groupId>
+            <artifactId>hsweb-easy-orm-core</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>

+ 120 - 0
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<String, Object> beanMap;
+
+    private Map<String, String> parameter = new HashMap<>();
+
+    private String prefix = "";
+
+    private static final Map<Class, Function<Object, String>> convertMap = new HashMap<>();
+
+    private static Function<Object, String> defaultConvert = String::valueOf;
+
+    private static final Set<Class> 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 <T> void putConvert(Class<T> type, Function<T, String> 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<String, String> convert() {
+        doConvert();
+
+        return parameter;
+    }
+
+}

+ 13 - 0
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请求参数:
+     * <pre>
+     *     {name:"test",org:[1,2,3]} => {"name":"test","org[0]":1,"org[1]":2,"org[2]":3}
+     * </pre>
+     *
+     * @param object
+     * @return
+     */
+    public static Map<String, String> objectToHttpParameters(Object object) {
+        return new HttpParameterConverter(object).convert();
+    }
+
     /**
      * 尝试获取当前请求的HttpServletRequest实例
      *

+ 90 - 0
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<String, Object> target = new HashMap<>();
+
+        Map<String, Object> info = new HashMap<>();
+        info.put("nickName", "小宋");
+        info.put("address", "重庆");
+
+
+        Map<String, Object> 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<String, String> 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<String, String> 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"), "%重庆%");
+
+    }
+}