springboot~ObjectMapper~dto到entity的自动赋值

实体与Dto自动赋值

在开发的过程中,实体之间相互赋值是很正常的事,但是我们一般的方法都通过set和get方法来进行的,如果要赋值的字段少那还行,但是需要赋值的字段超过10个,那就是个灾难,你会看到整屏代码中全是set和get方法。

  1. 两个实体属性字段几乎完全相同
  2. 两个字体有部分字段相同
  3. 源实体只有部分字段赋值,目标实体有完整的值

第一种情况

对于第1点来说,我们用到最多的就是entity和dto之间的转换了,这个我们可以使用Spring的工具类BeanUtils来解决,这里要注意的一点是,第一个参数是源,第二个参数是目标

import org.springframework.beans.BeanUtils;
BeanUtils.copyProperties(origin, target);

第二种情况

但是对于第2点来说,就没有那么简单了,再使用BeanUtils已经不能满足我们的需要了。
我们可以使用jackson的ObjectMapper

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.jd.fastjson.JSON;

ObjectMapper objectMapper = new ObjectMapper();
//配置该objectMapper在反序列化时,忽略目标对象没有的属性。凡是使用该objectMapper反序列化时,都会拥有该特性。
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//读入需要更新的目标实体
ObjectReader objectReader = objectMapper.readerForUpdating(target);
//将源实体的值赋值到目标实体上
objectReader.readValue(JSON.toJSONString(source));

我们总结一下objectMapper的过滤参数:

 /*
 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化
 Include.Include.ALWAYS 默认
 Include.NON_DEFAULT 属性为默认值不序列化
 Include.NON_EMPTY 属性为 空(“”)  或者为 NULL 都不序列化
 Include.NON_NULL 属性为NULL 不序列化
 */
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT);
    String outJson = objectMapper.writeValueAsString(productDetail);
//上面代码里,outJson的值将会过滤掉只有默认值的属性

第三种情况

本情况主要对于从dto到entity转换过程中出现 ,比如一个put操作,前端可能只修改某几个属性,而在后端处理时也只希望处理这几个被赋值的属性,这时我们使用下面的方法:

  @RequestMapping(value = "/{id}", method = RequestMethod.PUT)
  public HttpEntity update(@PathVariable int id, @RequestBody ProductDetail productDetail)
      throws IOException {
    ProductDetail existing = repository.findById(id).get();
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT);
    String outJson = objectMapper.writeValueAsString(productDetail);
    ObjectReader objectReader = objectMapper.readerForUpdating(existing);
    objectReader.readValue(outJson);
    repository.save(existing);
    return new ResponseEntity<>(existing, HttpStatus.ACCEPTED);
  }

集合转集合

 String requestData="[]";
  List<ProductDetail> list = objectMapper.readValue(requestData,
        new TypeReference<List<ProductDetail>>() {
        });
    repository.saveAll(list);

通过objectMapper的使用,确实让我们少写很多重复的代码。

posted @   张占岭  阅读(7732)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2012-08-01 将不确定变为确定~LINQ查询包含对不同数据上下文上所定义项的引用
2011-08-01 XML遍历(LINQ TO XML的魅力)
2011-08-01 cookies可以跨域了~单点登陆(a.com.cn与b.com.cn可以共享cookies)
2011-08-01 EXCEL中如果输入一个数,然后自动让它乘以某个常数(第一列乘6,第二列乘4)
点击右上角即可分享
微信分享提示