当前位置: 首页 > news >正文

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. 性能优化

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

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

        http://www.dtcms.com/a/361273.html

        相关文章:

      • FFMPEG 10BIT下 Intel b570 qsv 硬解AV1,H265视频编码测试
      • 《Shell 大道:筑基篇(上)—— 神念控流程,函数成符阵》
      • 机器学习——模型架构
      • ✝常用表格✝
      • 读《独角兽项目:数字化转型》
      • 【开题答辩全过程】以 基于微信小程序的校园二手物品交易平台的设计与实现为例,包含答辩的问题和答案
      • 分布式光伏模式怎么选?从 “凭经验” 到 “靠数据”,iSolarBP 帮你锁定最优解
      • 苹果WWDC25开发秘鉴:AI、空间计算与Swift 6的融合之道
      • 领码方案:低代码平台前端缓存与 IndexedDB 智能组件深度实战
      • GDAL 简介
      • FAST API部署和使用
      • java讲解自己对业务架构、数据架构、应用架构的理解
      • gh-pages部署github page项目
      • 【机器学习入门】5.1 线性回归基本形式——从“选西瓜”看懂线性模型的核心逻辑
      • A2A + MCP 的python实现的最小可运行骨架
      • duilib中CTextUI控件使用技巧与问题总结(CTextUI控件自适应文字宽度特性)
      • 五、练习2:Git分支操作
      • 四、操作系统
      • 腾讯混元翻译大模型Hunyuan-MT-7B:重塑跨语言沟通的技术革命
      • 2025年应届生求职加分指南:这些新兴技能路径让你脱颖而出
      • 电子电气架构 --- 智能电动车EEA电子电气架构(下)
      • 【LeetCode 热题 100】5. 最长回文子串——中心扩散法
      • Linux按键输入实验
      • (纯新手教学)计算机视觉(opencv)实战十一——轮廓近似(cv2.approxPolyDP)
      • Python OpenCV图像处理与深度学习:Python OpenCV特征检测入门
      • “人工智能+”时代的端侧AI:算力下沉与实时视频的新基座
      • crypto-whatkey(2025YC行业赛)
      • 【OpenFeign】基础使用
      • 移动端签名组件横屏实现
      • LeetCode199. 二叉树的右视图 - 解题思路与实现