记录加入对象拷贝功能及遇到的问题
Java工程我们常用的POJO类型一般分为 po, dto, vo, query。po代表实体类,dto代表提交对象,vo代表返回对象,query代表查询对象。
当我们使用mybatis-plus,或者tk mybatis时,简单的curd就交给BaseMapper处理,但BaseMapper的参数对象一般都是po对象。那么问题就来了,每当
比如提交时,需要从dto中一一set给po对象,虽然可以用lombok的@builder注解来链式的set,但还是比较麻烦。这个时候就需要用到spring的一个神器:
BeanUtils。可以用一行代码完美解决以上的问题,复制dto与po中相同的属性到po中,大大减少工作量。
- 安装
1
2
3
4
5
6<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
注意到以上的版本,这边有个需要注意的,但很容易忽略的问题:包版本的问题。我使用的spring-boot-starter 2.1.8.RELEASE版本,它的spring-core是
5.1.9.RELEASE版本,而当时我搜索spring-beans版本时直接安装的最新版本5.3.3。这就导致我运行的时候出现了以下异常:1
Caused by: java.lang.NoSuchMethodError: org.springframework.core.MethodParameter.withContainingClass
没注意到版本问题的时候,百思不得其解,为啥没有这个方法,没道理啊,其实很简单,版本不一致就会导致这样的问题,特别是spring-beans大于spring-core的版本。
接下来就好解决啦,直接使用对应版本安装即可。
- 使用例如:
有PatrolTarget, PatrolTargetDTO两个类,现在需要复制PatrolTargetDTO中的属性到PatrolTarget中,
PatrolTarget:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class PatrolTarget implements Serializable
{
private static final long serialVersionUID = 1L;
private String id;
private String organizationId;
private String name;
private String remark;
private Integer xh;
private Boolean delFlag;
private String createBy;
private Date createTime;
private String modifyBy;
private Date modifyTime;
}
PatrolTargetDTO:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class PatrolTargetDTO implements Serializable
{
private static final long serialVersionUID = 2059098506832331634L;
private String id;
private String organizationId;
private String name;
private String remark;
m
private String xh;
private String createBy;
private String modifyBy;
private List<String> typeIds;
}
复制:1
2
3
4
5
6
7
8
9
10public static void main(String[] args)
{
PatrolTargetDTO patrolTargetDTO = new PatrolTargetDTO();
patrolTargetDTO.setId("12313123123123");
patrolTargetDTO.setTypeIds(new ArrayList<>(Arrays.asList("1", "2", "3")));
PatrolTarget patrolTarget = new PatrolTarget();
BeanUtils.copyProperties(patrolTargetDTO, patrolTarget);
System.out.println(patrolTarget.getId());
//result 12313123123123
}