前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DTO到entity自动赋值

DTO到entity自动赋值

作者头像
后端码匠
发布2021-06-09 15:23:46
1.3K0
发布2021-06-09 15:23:46
举报
文章被收录于专栏:后端码匠后端码匠

实体与Dto自动赋值

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

第一种情况

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

代码语言:javascript
复制
import org.springframework.beans.BeanUtils;

BeanUtils.copyProperties(origin, target);

第二种情况

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

代码语言:javascript
复制
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的过滤参数:

代码语言:javascript
复制
/*
 通过该方法对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操作,前端可能只修改某几个属性,而在后端处理时也只希望处理这几个被赋值的属性,这时我们使用下面的方法:

代码语言:javascript
复制
    @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);
    }

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端码匠 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实体与Dto自动赋值
  • 第一种情况
  • 第二种情况
  • 第三种情况
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档