实体与Dto(MODEL)之间的转换问题

实体与Dto(MODEL)之间的转换问题

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

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

情况一:
用到最多的就是entity和dto之间的转换,使用Spring的工具类BeanUtils来解决、
第一参数 是源,第二个是目标参数。

import org.springframework.beans.BeanUtils;
BeanUtils.copyProprties(orgin,target);

情况二:
BeanUtils 已经不能满足,要使用ackson的ObjectMapper

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jaskson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;

ObjectMapper objectMapper=new ObjectMapper();

//1. 配置改objectMapper在反序列化时,忽略目标对象没有属性。凡是使用该objectMapper反序列化时,都拥有该属性
objectMapper.configure(DeserializationFeature.Fail_on_unknown_properties,false);

//2. 读入需要更新的目标实体
ObjectReader objectReader =objectMapper.readerForUpdating(target);

//3. 将源实体的值赋值到目标实体上。
objectReader.readValue(JSON.toJSONString(source));
/*
通过该方法对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);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值