add HttpParameterConverter

This commit is contained in:
zhou-hao
2017-11-29 13:05:52 +08:00
parent 9231069638
commit 2c6eac2ff2
4 changed files with 232 additions and 0 deletions

View File

@@ -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>

View File

@@ -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;
}
}

View File

@@ -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实例
*

View File

@@ -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"), "%重庆%");
}
}