Apache Commons ConvertUtils

发布于:2025-09-02 ⋅ 阅读:(17) ⋅ 点赞:(0)

Apache Commons BeanUtils 包中的ConvertUtils工具类,就像一位贴心的 "类型转换管家",将这些繁琐操作封装成简洁接口

一、原生类型转换的 "痛与泪"

先看一个典型场景:将 Web 表单提交的字符串参数转换为对应类型。用 JDK 原生方法实现是这样的:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class NativeConversionExample {
    public static void main(String[] args) {
        String ageStr = "25";
        String birthDateStr = "2023-01-15";
        String isActiveStr = "true";

        // 字符串转整数
        int age;
        try {
            age = Integer.parseInt(ageStr);
        } catch (NumberFormatException e) {
            throw new IllegalArgumentException("年龄格式错误", e);
        }

        // 字符串转日期
        Date birthDate;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            birthDate = sdf.parse(birthDateStr);
        } catch (ParseException e) {
            throw new IllegalArgumentException("日期格式错误", e);
        }

        // 字符串转布尔值
        boolean isActive = Boolean.parseBoolean(isActiveStr);

        System.out.println("转换结果: age=" + age + ", birthDate=" + 
                          birthDate + ", isActive=" + isActive);
    }
}

这段代码仅实现三个简单的类型转换,就包含了:

  • 多个try-catch块处理转换异常

  • 手动创建日期格式化器

  • 不同类型转换逻辑分散,难以统一维护

而用ConvertUtils实现同样功能,代码量可减少 60%:

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.*;
import java.util.Date;
public class ConvertUtilsExample {
    public static void main(String[] args) {
        // 注册自定义转换器(日期转换)
        ConvertUtils.register(new DateConverter(null), Date.class);

        String ageStr = "25";
        String birthDateStr = "2023-01-15";
        String isActiveStr = "true";

        // 字符串转整数(自动处理异常)
        int age = ConvertUtils.convert(ageStr, Integer.class);

        // 字符串转日期(支持多种格式)
        Date birthDate = ConvertUtils.convert(birthDateStr, Date.class);

        // 字符串转布尔值
        boolean isActive = ConvertUtils.convert(isActiveStr, Boolean.class);

        System.out.println("转换结果: age=" + age + ", birthDate=" + 
                          birthDate + ", isActive=" + isActive);
    }
}

无需手动处理异常,无需关心具体转换逻辑,ConvertUtils通过统一接口实现了类型的安全转换。

二、ConvertUtils 核心功能:类型转换的 "全能工具箱"

ConvertUtils包含 20 + 个核心方法,支持 60 + 种类型转换,按功能可分为三大类:

1. 基础类型与包装类型转换

(1)字符串与基础类型互转
import org.apache.commons.beanutils.ConvertUtils;
public class BasicTypeConversion {
    public static void main(String[] args) {
        // 字符串转数字
        int intValue = ConvertUtils.convert("123", int.class); // 123
        double doubleValue = ConvertUtils.convert("3.14", double.class); // 3.14

        // 数字转字符串(自动处理null)
        String str1 = ConvertUtils.convert((Integer) null, String.class); // ""
        String str2 = ConvertUtils.convert(100, String.class); // "100"

        // 布尔值转换(支持多种格式:true/TRUE/1/yes等)
        boolean bool1 = ConvertUtils.convert("True", boolean.class); // true
        boolean bool2 = ConvertUtils.convert("0", boolean.class); // false
    }
}
(2)数组与集合类型转换
import org.apache.commons.beanutils.ConvertUtils;
import java.util.Arrays;
public class CollectionConversion {
    public static void main(String[] args) {
        // 字符串数组转整数数组
        Integer[] intArray = ConvertUtils.convert(
            new String[]{"1", "2", "3"}, Integer[].class
        );

        // 集合转数组
        String[] strArray = ConvertUtils.convert(
            Arrays.asList("a", "b", "c"), String[].class
        );
    }
}
2.  时间戳与日期互转
(1)字符串与日期互转

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;
import java.util.Date;
public class DateConversion {
    public static void main(String[] args) {
        // 注册日期转换器(支持多种格式)
        DateConverter dateConverter = new DateConverter(null);
        dateConverter.setPatterns(new String[]{"yyyy-MM-dd", "MM/dd/yyyy"});
        ConvertUtils.register(dateConverter, Date.class);

        // 字符串转日期
        Date date1 = ConvertUtils.convert("2023-10-01", Date.class);
        Date date2 = ConvertUtils.convert("10/01/2023", Date.class);

        // 日期转字符串
        String dateStr = ConvertUtils.convert(date1, String.class);
    }
}
(2)时间戳与日期互转
import org.apache.commons.beanutils.ConvertUtils;
import java.util.Date;
public class TimestampConversion {
    public static void main(String[] args) {
        // 时间戳转日期
        Date date = ConvertUtils.convert(1696166400000L, Date.class); // 2023-10-01

        // 日期转时间戳
        long timestamp = ConvertUtils.convert(new Date(), Long.class);
    }
}

3. 复杂对象与集合转换

(1)字符串与对象互转
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.BeanConverter;
public class BeanConversion {
    public static void main(String[] args) {
        // 注册Bean转换器
        ConvertUtils.register(new BeanConverter(), User.class);

        // JSON字符串转对象(需配合JSON库)
        String json = "{\"name\":\"张三\",\"age\":25}";
        User user = ConvertUtils.convert(json, User.class);

        // 对象转字符串(调用toString())
        String userStr = ConvertUtils.convert(user, String.class);
    }
}
class User {
    private String name;
    private int age;
    // getter/setter略
}
(2)集合元素类型统一转换

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.Converter;
import java.util.Arrays;
import java.util.List;
public class CollectionElementConversion {
    public static void main(String[] args) {
        // 自定义集合元素转换器(字符串转整数)
        Converter converter = (input, targetType) -> {
            if (input == null) return null;
            return Integer.parseInt(input.toString());
        };

        // 注册转换器
        ConvertUtils.register(converter, Integer.class);

        // 集合元素批量转换
        List<String> strList = Arrays.asList("1", "2", "3");
        Integer[] intArray = ConvertUtils.convert(strList, Integer[].class);
    }
}

三、最佳实践与避坑指南

1. 依赖与版本管理

在 Maven 中引入commons-beanutils依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-beanutils</artifactId>
    <version>1.9.4</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

注意ConvertUtils属于commons-beanutils包,需单独引入。

2. 自定义转换器注册

对于框架不支持的特殊类型(如枚举、自定义日期格式),需注册自定义转换器:// 注册枚举转换器(字符串转枚举)

ConvertUtils.register((input, targetType) -> {    if (input == null) return null;    return Enum.valueOf((Class<Enum>) targetType, input.toString());}, Enum.class);

3. 异常处理策略

    • 全局捕获ConvertException,统一转换为业务异常

    • 对关键转换添加默认值处理:

    int age = ConvertUtils.convert("invalid", int.class, 0); // 转换失败返回0

    4. 性能优化

      • 避免在循环中频繁注册转换器,建议在应用启动时统一注册

      • 对大集合转换,优先使用数组转换而非集合转换(减少包装对象开销)