Apache Commons ConvertUtils
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); // 123double 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); // trueboolean 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. 性能优化
避免在循环中频繁注册转换器,建议在应用启动时统一注册
对大集合转换,优先使用数组转换而非集合转换(减少包装对象开销)