思路
通过反射修改对象的某个属性
代码
1:定义后端接受对象
/**
* id(修改的数据ID)
*/
private String id;
/**
* 更新字段名称
*/
private String fieldName;
/**
* 更新内容
*/
private List<Object> content;
2:实现方法
@Override
public void saveOneUpdate(定义的后端接受对象 dto) {
//通过id查询出数据
Demand demand = demandRepository.findById(dto.getId())
.orElseThrow(() -> new BusinessException(ErrorConstant.NOT_EXIST.format("需求信息")));
try {
//根据属性名设置它的值
Field f = demand.getClass().getDeclaredField(dto.getFieldName());
//允许访问私有变量
f.setAccessible(true);
String type = f.getGenericType().toString();
log.info("类型:{}", type);
//类型判断
if (!type.equals("java.util.List<java.lang.String>")) {
List<String> result = new ArrayList<String>();
if (dto.getContent() instanceof ArrayList<?>) {
for (Object o : (List<?>) dto.getContent()) {
result.add(o.toString());
}
}
switch (type.substring(type.lastIndexOf(".") + 1)) {
case "PriorityEnum": //枚举类型
f.set(demand, PriorityEnum.valueOf(result.get(0)));
break;
case "LocalDateTime": //时间类型
Instant instant = Instant.ofEpochMilli(Long.parseLong(result.get(0)));
ZoneId zone = ZoneId.systemDefault();
f.set(demand, LocalDateTime.ofInstant(instant, zone));
break;
case "String":
f.set(demand, result.get(0));
break;
default:
throw new BusinessException(ErrorConstant.E99.format("暂不支持的其他类型修改!"));
}
log.info("更新后数据:{}", demand);
save(demand); //修改
return;
}
f.set(demand, dto.getContent());
save(demand); //修改
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}