记录加入对象拷贝功能及遇到的问题

记录加入对象拷贝功能及遇到的问题

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

    @Data
    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
@Data
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
10
public 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
}

Donate comment here