springboot~ObjectMapper~dto到entity的自动赋值
实体与Dto自动赋值
在开发的过程中,实体之间相互赋值是很正常的事,但是我们一般的方法都通过set和get方法来进行的,如果要赋值的字段少那还行,但是需要赋值的字段超过10个,那就是个灾难,你会看到整屏代码中全是set和get方法。
- 两个实体属性字段几乎完全相同
- 两个字体有部分字段相同
- 源实体只有部分字段赋值,目标实体有完整的值
第一种情况
对于第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的使用,确实让我们少写很多重复的代码。
springboot~ObjectMapper~dto到entity的自动赋值的更多相关文章
- 关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明
一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载) ...
- Springboot+Vue实现仿百度搜索自动提示框匹配查询功能
案例功能效果图 前端初始页面 输入搜索信息页面 点击查询结果页面 环境介绍 前端:vue 后端:springboot jdk:1.8及以上 数据库:mysql 核心代码介绍 TypeCtrler .j ...
- 你来说一下springboot的启动时的一个自动装配过程吧
前言 继续总结吧,没有面试就继续夯实自己的基础,前阵子的在面试过程中遇到的各种问题陆陆续续都会总结出来分享给大家,这次要说的也是面试中被问到的一个高频的问题,我当时其实没答好,因为很早之前是看到spr ...
- ABP vNext 实现租户Id自动赋值插入
背景 在使用ABP vNext过程中,因为我们的用户体系庞大,所以一直与其他业务同时开发,在开发其他业务模块时,我们一直存在着误区:认为ABP vNext 自动处理了数据新增时的租户Id(Tenant ...
- 基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理
我们在设计数据库表的时候,往往为了方便,主键ID一般采用字符串类型或者GUID类型,这样对于数据库表记录的迁移非常方便,而且有时候可以在处理关联记录的时候,提前对应的ID值.但有时候进行数据记录插入的 ...
- 【js】将table的每个td的内容自动赋值给其title属性
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- jpa Auditor 自动赋值与自定义 @CreatedBy @LastModifiedBy @CreatedDate @LastModifiedDate
在spring jpa audit 中,在字段或者方法上使用注解@CreatedDate.@CreatedBy.@LastModifiedDate.@LastModifiedBy,当进行实体插入或者更 ...
- java项目中VO和DTO以及Entity,各自是在什么情况下应用
1.entity里的每一个字段,与数据库相对应, 2.dto里的每一个字段,是和你前台页面相对应, 3.VO,这是用来转换从entity到dto,或者从dto到entity的中间的东西. 举个例子 ...
- java 使用反射在dto和entity 实体类之间进行转换
package com.example.demo.utils; import java.lang.reflect.Method; import java.util.List; import com.e ...
随机推荐
- int i=0;i=i++
package algorithms.com.guan.javajicu; public class Inc { public static void main(String[] args) { In ...
- nsq源码阅读笔记之nsqd(二)——Topic
与Topic相关的代码主要位于nsqd/nsqd.go, nsqd/topic.go中. Topic的获取 Topic通过GetTopic函数获取 GetTopic函数用于获取topic对象,首先先尝 ...
- 51nod_1412_AVL树的种类_动态规划
51nod_1412_AVL树的种类_动态规划 题意: 平衡二叉树(AVL树),是指左右子树高度差至多为1的二叉树,并且该树的左右两个子树也均为AVL树. 现在问题来了,给定AVL树的节点个数n,求有 ...
- vue不是内部或外部命令解决验证方案
一.前提 1.该教程是在你已经安装配置好node.js和express情况下 2.你已经完成了vue和vue-cli的全局安装 3.完成以上2步后,使用vue指令,会显示"vue不是内部或外 ...
- VMware workstation创建虚拟机console
1. 使用VMware workstation创建虚拟机硬件2. 安装操作系统3. 操作系统安装过程 1. 使用VMware workstation创建虚拟机硬件 使用VMware workstati ...
- java中“==”和equals方法的区别,再加上特殊的String引用类型
==和equals的区别: 1.==是运算符,而equals是基类Object定义的一个方法,并且equals使用==定义的 2.进行比较时,分为 基本数据类型 的比较和 引用数据类型 的比较 ...
- Python 实现文件复制、删除
Python 实现文件复制.删除 转载至:http://www.cnblogs.com/sld666666/archive/2011/01/05/1926282.html 用python实现了一个小 ...
- [翻译 EF Core in Action 2.3] 理解EF Core数据库查询
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- Java语言编程 - Java第一个程序HelloWorld
3.1 新建Java文件 首先新建一个文件夹,用于存放写的Java程序,例如我存放Java程序的位置为” D:\Files\code\java”. 在该文件夹中,右键新建一个文本文档 将文件名重命名为 ...
- Qt之加减乘除四则运算-支持负数
一.效果展示 如图1所示,是简单的四则运算测试效果,第一列为原始表达式,第二列为转换后的后缀表达式,冒号后为结果.表达式支持负数和空格,图中是使用了5组测试数据,测试结果可能不全,如大家发现算法有问题 ...