Apache的BeanUtils拷贝对象日期属性转换问题

在使用Apache Commons BeanUtils的copyProperties方法时,如果源对象中存在日期类型的属性值为空,会抛出ConversionException。解决办法是在调用前为ConvertUtils注册日期转换器并设置默认值为null。此问题在阿里编码规约中被建议避免使用BeanUtils直接复制属性。
摘要由CSDN通过智能技术生成

现象

org.apache.commons.beanutils.ConversionException: No value specified for 'java.sql.Timestamp'
org.apache.commons.beanutils.ConversionException: No value specified for 'java.sql.Date'
org.apache.commons.beanutils.ConversionException: No value specified for 'Date'

当调用 org.apache.commons.beanutils.BeanUtils.copyProperties(Object dest,Object orig) 方法时,当对象中有日期类属性且值为空时,会抛错 ConversionExcetpion : no value specified for XXX。

测试代码

依赖

<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.8.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>

DTO

package cn.pengld.beanutiltest;

import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Date;

/**
 * @ClassName Account
 * @Description
 * @Author pengld
 * @Date 2021/6/2 22:40
 * @Version 1.0
 */
@Data
public class Account implements Serializable {
    Integer id;
    String nickname;
    Date birth;
    java.sql.Date birth2;
    Timestamp birth3;


    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", nickname='" + nickname + '\'' +
                ", birth=" + birth +
                ", birth2=" + birth2 +
                ", birth3=" + birth3 +
                '}';
    }
}

Test

package cn.pengld.beanutiltest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;

/**
 * @ClassName BeanUtilEx
 * @Description
 * @Author pengld
 * @Date 2021/6/2 22:11
 * @Version 1.0
 */
public class BeanUtilEx  {

    public static void main(String[] args) {
        Account account = new Account();
        account.setId(1);
        account.setNickname("liming");
        Account account2 = new Account();
        try {
//            ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.sql.Date.class);
//            ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.util.Date.class);
//            ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlTimestampConverter(null), java.sql.Timestamp.class);
            BeanUtils.copyProperties(account2,  account);
            System.out.println(account);
            System.out.println(account2);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

解决方案

为ConvertUtils注册日期来的converter,设置defaultValue为null,即当类属性为空时设置为 NULL

ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.sql.Date.class);
ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlDateConverter(null), java.util.Date.class);
ConvertUtils.register(new org.apache.commons.beanutils.converters.SqlTimestampConverter(null), java.sql.Timestamp.class);

阿里编码规约检查

避免使用Apache BeanUtils进行属性的copy

避免使用Apache-BeanUtils
IDE 安装阿里编码规约扫描插件,开启扫描,显示:

避免使用Apache-BeanUtils

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值