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

 更新时间:2018年08月01日 14:27:22   作者:张占岭  
这篇文章主要介绍了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);
 }

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

总结

以上所述是小编给大家介绍的springboot~ObjectMapper~dto到entity的自动赋值,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • JUnit5中的参数化测试实现

    JUnit5中的参数化测试实现

    参数化测试使得我们可以使用不同的参数运行同一个测试方法,从而减少我们编写测试用例的工作量,本文主要介绍了JUnit5中的参数化测试实现,感兴趣的可以了解一下
    2023-05-05
  • java设计模式之中介者模式

    java设计模式之中介者模式

    这篇文章主要为大家详细介绍了java设计模式之中介者模式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Spring Data JPA实现动态查询的两种方法

    Spring Data JPA实现动态查询的两种方法

    本篇文章主要介绍了Spring Data JPA实现动态查询的两种方法,具有一定的参考价值,有兴趣的可以了解一下。
    2017-04-04
  • @Schedule 如何解决定时任务推迟执行

    @Schedule 如何解决定时任务推迟执行

    这篇文章主要介绍了@Schedule 如何解决定时任务推迟执行问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • springboot整合freemarker详解

    springboot整合freemarker详解

    本篇文章主要介绍了springboot整合freemarker详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java文件管理操作的知识点整理

    Java文件管理操作的知识点整理

    这篇文章主要为大家详细介绍了Java中文件管理操作的一些知识点和实现方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-09-09
  • Spring的嵌套事务(Propagation.NESTED)到底是个啥案例代码讲解

    Spring的嵌套事务(Propagation.NESTED)到底是个啥案例代码讲解

    SavePoint是数据库事务中的一个概念, 可以将整个事务切割为不同的小事务,可以选择将状态回滚到某个小事务发生时的样子,本文通过案例代码讲解Spring的嵌套事务(Propagation.NESTED)到底是个啥,感兴趣的朋友跟随小编一起看看吧
    2023-01-01
  • 解析SpringBoot自定义参数校验注解

    解析SpringBoot自定义参数校验注解

    这篇文章主要介绍了SpringBoot自定义参数校验注解,引入依赖,spring validation是在hibernate-validator上做了一层封装,文中提到了定义参数校验注解与处理器的示例代码,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • java虚拟机内存溢出及泄漏实例

    java虚拟机内存溢出及泄漏实例

    本篇文章给大家分享了java虚拟机内存溢出及泄漏的实例以及相关知识点分享,有兴趣的朋友参考学习下。
    2018-06-06
  • Java配置win10环境变量过程图解

    Java配置win10环境变量过程图解

    这篇文章主要介绍了Java配置win10环境变量过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论