JavaWeb之如何把请求数据转成实体类
- 自己写个工具类加入下面两个静态方法
- 自定一个注解类DateTimeFormatting
- 调用方式
User user = util.ObjectFromMap(req.getParameterMap(), User.class)
- 暂时支持8种基本数据类型对应包装类、
BigDecimal
、java.util.Date
,可应对大多情况,如有需求,可以自己添加 - 暂不支持数组
public static <T> T ObjectFromMap(Map<String,String[]> map, Class<T> type) {
try {
T t = type.getConstructor().newInstance();
for (Map.Entry<String, String[]> entry : map.entrySet()) {
String key = entry.getKey();
String[] values = entry.getValue();
if (!checkObjectHasField(type,key)) {
continue;
}
PropertyDescriptor pd = new PropertyDescriptor(key,type);
Method method = pd.getWriteMethod();
String value = values[0];
String propertyType = pd.getPropertyType().getName();
if(value.length() > 0) {
switch (propertyType) {
case "java.lang.Byte":
method.invoke(t, Byte.valueOf(value));
break;
case "java.lang.Integer":
method.invoke(t, Integer.valueOf(value));
break;
case "java.lang.Short":
method.invoke(t, Short.valueOf(value));
break;
case "java.lang.Long":
method.invoke(t, Long.valueOf(value));
break;
case "java.lang.Float":
method.invoke(t, Float.valueOf(value));
break;
case "java.lang.Double":
method.invoke(t, Double.valueOf(value));
break;
case "java.lang.Boolean":
method.invoke(t, Boolean.valueOf(value));
break;
case "java.lang.Character":
method.invoke(t, value.charAt(0));
break;
case "java.lang.String":
method.invoke(t, value);
break;
case "java.math.BigDecimal":
method.invoke(t, new BigDecimal(value));
break;
case "java.util.Date":
String format = "yyyy-MM-dd";
Field field = type.getDeclaredField(key);
DateTimeFormatting anno = field.getAnnotation(DateTimeFormatting.class);
if (anno != null) {
format = anno.value();
}
method.invoke(t, new SimpleDateFormat(format).parse(value));
break;
default:
break;
}
} else {
if (propertyType.equals("java.lang.String")) {
method.invoke(t, value);
}
}
}
return t;
} catch (InstantiationException | IllegalAccessException
| InvocationTargetException | NoSuchMethodException
| IntrospectionException | NoSuchFieldException e
| ParseException e) {
e.printStackTrace();
}
return null;
}
public static boolean checkObjectHasField(Class type,String fieldName) {
Field[] fields = type.getDeclaredFields();
for (Field field : fields) {
if (field.getName().equals(fieldName)) {
return true;
}
}
return false;
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DateTimeFormatting {
String value() default "yyyy-MM-dd";
}