目录
项目结构
需求
将前端传递的参数与实体类的值进行映射
测试代码
public static void main(String[] args) {
/**
* 构建前端传递的数据
*/
Map<String,String> paramMap = new HashMap<>();
paramMap.put("name_pre","hanchao");
paramMap.put("phone_pre","18888888888");
paramMap.put("age_pre","18");
paramMap.put("birthday_pre","1998-03-11");
//将前端传递变量的key与实体类属性对应
Map<String,String> fieldMapped = processFieldMapped(UserDO.class);
UserDO userDO = new UserDO();
//生成MetaObject对象
MetaObject metaObject = MetaObjectFactory.getObjectInstance(userDO);
//对MetaObject对象的setValue方法进行修改, 主要是解决属性类型转换问题
MetaObjectDecorator decorator = new MetaObjectDecorator();
decorator.setMetaObject(metaObject);
Set<Map.Entry<String, String>> entries = paramMap.entrySet();
for (Map.Entry<String, String> entry : entries){
String key = entry.getKey();
String fieldName = fieldMapped.get(key);
//赋值
decorator.setValue(fieldName,entry.getValue());
}
System.out.println(metaObject.getOriginalObject());
}
private static Map<String, String> processFieldMapped(Class<UserDO> userDOClass) {
Map<String,String> map = new HashMap<>();
Field[] declaredFields = userDOClass.getDeclaredFields();
for (int i = 0; i < declaredFields.length; i++) {
Field field = declaredFields[i];
field.setAccessible(true);
FieldMapped annotation = field.getAnnotation(FieldMapped.class);
map.put(annotation.value(),field.getName());
}
return map;
}
FieldMapped
MetaObjectDecorator
/**
* @author hanchao
* @version 1.0
* @date 2022/5/24 22:41
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class MetaObjectDecorator {
private MetaObject metaObject;
private List<TypeHandler> typeHandlerList = new ArrayList<>();
{
//获取TypeHandler接口的所有子类
String aPackage = ClassUtil.getPackage(TypeHandler.class);
Set<Class<?>> classes = ClassUtil.scanPackage(aPackage);
Set<Class<?>> collect = classes.stream().filter(sonClass -> {
boolean allAssignableFrom = ClassUtil.isAllAssignableFrom(new Class[]{TypeHandler.class}, new Class[]{sonClass});
//要将 本身排除
return allAssignableFrom && sonClass != TypeHandler.class;
}).collect(Collectors.toSet());
try {
for (Class<?> clazz : collect){
Object o = clazz.newInstance();
typeHandlerList.add((TypeHandler) o);
}
}catch (Exception e){
System.out.println("类扫描异常");
}
}
public void setValue(String name, Object value){
try {
metaObject.setValue(name,value);
}catch (ReflectionException e){
if (e.getCause().getMessage().equals("argument type mismatch")){
Class<?> setterType = metaObject.getSetterType(name);
for (TypeHandler handler : typeHandlerList){
if (handler.support(setterType)){
metaObject.setValue(name,handler.typeReplacement(value.toString()));
}
}
}
}
}
}