1. 问题描述
之前在SpringBoot中,Controller 层一直用实体类去接收Json字符串,这样的好处就是只要实体类的结构与Json的结构一一对应,就可以很方便的接收,不用再进行转换处理。
但是有时候采用这种方式接收的实体类不方便存入数据库,比如说下面这个实体类,含有List和 Map ,存入数据库中很不方便:
实体类: LongtermDispatchPlanConParamDTO
public class LongtermDispatchPlanConParamDTO {
private String schedulingplanName;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date maketime;
private String userName;
private List<StationParameter> stationParameterList;
private Map<String,List<Constraintltem>> stationConstraintMap;
}
2. 解决思路
我的解决思路是这样的
- 在上面类中,前三个属性定义为主键字段,另增一个字段存储从前端传过来的整个Json字符串(这里类型定义为CLOB,以免超出varchar2 的 4000长度)
表 LONGTERM_DISPATCHPLAN_CON:
对应实体类:
public class LongtermDispatchplanConEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String schedulingplanName;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@Id
private Date maketime;
@Id
private String userName;
private String jsonString;
}
- 写好操作上表的增删改查
- Controller接收时用 cn.hutool.json.JSONObject 接收,然后将JSONObject 转化为结构一致的实体类对象LongtermDispatchPlanConParamDTO ,构造 LongtermDispatchplanConEntity对象存入数据库
@PostMapping("/insertListbyDTOJson")
public void insertListbyDTOLongtermDispatchplanCon( @RequestBody JSONObject jsonParam) {
// 将JSONObject 转换为 对应的Bean对象
Class<LongtermDispatchPlanConParamDTO> clazzClass = LongtermDispatchPlanConParamDTO.class;
LongtermDispatchPlanConParamDTO dto = jsonParam.toBean(clazzClass);
//将JSONObject 以LongtermDispatchplanConEntity 中的 jsonString字符串形式存入数据库
LongtermDispatchplanConEntity ldpConEntity = new LongtermDispatchplanConEntity();
// 复制部分属性
BeanUtils.copyProperties(dto, ldpConEntity);
// 赋值 jsonString
ldpConEntity.setJsonString(jsonParam.toString());
// 存入数据库
longtermDispatchplanConDao.save(ldpConEntity);
log.info("longtermdispatchplancon insertListbyDTOJson success");
}
4. 在返回Json字符串时,前端传过来主键信息,从数据库去取出LongtermDispatchplanConEntity,然后 构造 LongtermDispatchPlanConParamDTO,前端就可以正确接收了。
@PostMapping("/getByIds")
public LongtermDispatchPlanConParamDTO getByIdsLongtermDispatchplanCon( @RequestBody LongtermDispatchplanConParamsVO2 p) {
LongtermDispatchplanConParamsVO lp = new LongtermDispatchplanConParamsVO();
BeanUtils.copyProperties(p, lp);
// 根据 LongtermDispatchplanConParamsVO 从表中查询LongtermDispatchplanConEntity
List<LongtermDispatchplanConEntity> ldpConEntitys = longtermDispatchplanConDaoM.findByIds(lp);
if(ldpConEntitys !=null) {
LongtermDispatchplanConEntity ldpConEntity = ldpConEntitys.get(0);
//获得json字符串
String jsonString = ldpConEntity.getJsonString();
//利用 json字符串构造JSONObject对象
JSONObject jsonParam = new JSONObject(jsonString,false);
//转换为 LongtermDispatchPlanConParamDTO对象
Class<LongtermDispatchPlanConParamDTO> clazzClass = LongtermDispatchPlanConParamDTO.class;
LongtermDispatchPlanConParamDTO dto = jsonParam.toBean(clazzClass);
return dto;
}
else {
throw new DataException(200, p.toString()+"没有信息");
}
}
上面用的操作Json 的都是来自 Hutool的,真是很好的工具