mirror of
https://github.com/hs-web/hsweb-framework.git
synced 2026-05-19 06:18:15 +08:00
add HttpParameterConverter
This commit is contained in:
@@ -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>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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实例
|
||||
*
|
||||
|
||||
@@ -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"), "%重庆%");
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user