使用 Apache BeanUtils 将字符串转换为枚举

2024-05-03

我已经为 Apache BeanUtils 库实现了一个转换器,用于将 String 转换为枚举常量:

class EnumConverter implements Converter {    
    @Override
    public <T> T convert(Class<T> tClass, Object o) {
        String enumValName = (String) o;
        Enum[] enumConstants = (Enum[]) tClass.getEnumConstants();

        for (Enum enumConstant : enumConstants) {
            if (enumConstant.name().equals(enumValName)) {
                return (T) enumConstant;
            }
        }

        throw new ConversionException(String.format("Failed to convert %s value to %s class", enumValName, tClass.toString()));
    }
}

我按以下方式使用它:

// Register my converter    
ConvertUtils.register(new EnumConverter(), Enum.class);
Map<String, String> propMap = new HashMap<String, String>();
// fill property map    
BeanUtils.populate(myBean, propMap);

不幸的是,myBean 实例中的 setter 除了 ConcreteEnumClass 枚举之外,而不是 java.lang.Enum,这就是为什么我在 BeanUtils.populate 方法调用期间收到以下异常:

org.apache.commons.beanutils.ConversionException: Default conversion to ConcreteEnumClass failed.
    at org.apache.commons.beanutils.converters.AbstractConverter.handleMissing(AbstractConverter.java:314)
    at org.apache.commons.beanutils.converters.AbstractConverter.handleError(AbstractConverter.java:269)
    at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:177)
    at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:61)
    at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:491)
    at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1000)
    at org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:821)
    at org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:431)

如果我通过以下方式注册 EnumConverter:

ConvertUtils.register(new EnumConverter(), ConcreteEnumClass.class);

一切都很完美。

因为我想在一般情况下使用 EnumConverter,所以我更喜欢用它来将 String 转换为任何枚举类。

是否可以?我该怎么做呢?


从当前的 BeanUtils v1.9.2 开始,我不相信使用静态单例时有任何方法可以做到这一点BeanUtils and ConvertUtils类。

您可以创建一个实例BeanUtilsBean,通过一个习惯ConvertUtilsBean对 Enum 目标进行特殊处理的实例。

这里显示了一个示例(不是我的示例,归功于其作者“jeremychone”):http://www.bitsandpix.com/entry/java-beanutils-enum-support-generic-enum-converter/ http://www.bitsandpix.com/entry/java-beanutils-enum-support-generic-enum-converter/

Jeremy的简单实现如下:

BeanUtilsBean beanUtilsBean = new BeanUtilsBean(new ConvertUtilsBean() {
    @Override
    public Object convert(String value, Class clazz) {
        if (clazz.isEnum()) {
            return Enum.valueOf(clazz, value);
        } else {
            return super.convert(value, clazz);
        }
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Apache BeanUtils 将字符串转换为枚举 的相关文章

随机推荐

  • C++中如何判断传入的缓冲区是否有效?

    在我的函数中 内存指针及其大小作为参数传递 int myFun uintptr t mem ptr int mem size Code here 有没有办法判断这块内存是否真的有效 操作系统是 CentOS Linux 版本 7 9 200
  • 虹膜和面部识别生物识别技术

    In blog Android P 中更好的生物识别技术 https android developers googleblog com 2018 06 better biometrics in android p html他们说 为了确保
  • 在显示之前在后台加载 Activity

    在将视图切换到该活动之前 是否可以在后台加载新活动 例如 我想要一个被调用并显示启动屏幕的斜杠屏幕活动 当显示此启动屏幕时 将加载下一个活动 当加载完成时 当 onCreate 完成时 启动屏幕活动结束 并显示新的活动 我知道另一个选择是在
  • GCDdispatch_barrier还是dispatch_sync?

    我有一些疑问dispatch barrier and dispatch sync 这是代码 void addPhoto Photo photo if photo 1 dispatch barrier async self concurren
  • NoneType 对象没有属性 find_all 使用 beautiful Soup 时出错

    我正在尝试阅读以下内容 我的目标是阅读此页面上的每个职位名称 https www cvbankas lt miestas Vilnius padalinys 5B 5D keyw python 我尝试过的 import requests f
  • 如果specfile中的某些条件不满足,如何中止rpm包的安装?

    还有一些事情Requires标签不满足 所以我写了一个脚本来验证这些东西 但是我把它们放在哪里呢 如果没有找到 那么我想退出安装 提示用户在尝试再次安装此 rpm 之前执行这些步骤 writing exit 1 in installtag
  • 如何在 Angular2 中嵌入视频?

    我想开发单页应用程序 它是一个视频门户 用户可以登录 查看视频列表 导航到单个视频 对视频进行评分 并可以执行所有媒体相关任务 例如 播放 暂停 调整音量和寻找视频位置 既然有
  • 设置文本并从剪贴板获取文本[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 在Android中 我需要一些代码来
  • Gremlin 按顶点属性分组并获取同一顶点中其他属性的总和

    我们有顶点来存储各种作业及其类型 并算作属性 我必须按状态和数量进行分组 我尝试了以下查询 该查询适用于一个属性 receiveCount g V hasLabel Jobs has Type within A B C group by T
  • OpenAL 初始化问题,仅限 iPod(?)

    我遇到了 OpenAL 问题 似乎只发生在 iPod 硬件上 奇怪的是它was工作正常 但现在不行了 我正在设置音频会话 AVAudioSession sharedInstance setCategory AVAudioSessionCat
  • Julia:如何使用 PyPlot 创建不同大小的子图?

    我想创建一个包含多个绘图的图形 不过我希望能够使每个图具有不同的大小 例如 我希望第一个子图的宽度大约是第二个子图的两倍 我希望做这样的事情 using PyPlot a rand 500 900 b rand 500 400 notice
  • Java for every循环工作

    我正在执行某项任务 当我无意中做错事时但代码执行并提供了正确的结果 我对此并不感到惊讶 并且想到每个循环的所有这些是如何工作的 示例 示例程序 public static void main String args String myInp
  • 使用 hisorian.py 时显示“找不到结束时间”

    我正在尝试收集我的应用程序的电池统计信息 运行指定的所有命令后http developer android com tools performance batterystats battery historian index html ht
  • 连接标签文本和 tmap 图中点的线

    我正在使用形状文件绘制 tmap 绘图 并且我想在形状文件上绘制几个具有长纬度坐标的点 我的绘图工作得很好 但是地图上有太多点 这意味着不同点的标签文本是重叠的 并且一般来说不是特别清晰 here s what the plot curre
  • 在Python中执行局部标准差

    我试图获取图像每个像素的局部标准差 这意味着对于每个像素 我想计算其值及其邻居值的标准差 我用了this http docs scipy org doc numpy reference routines statistics html图书馆
  • 如何使用 Windows 8 RT 的开发人员许可证手动签署 exe 文件

    我为 Windows 8 RT 制作了一个 exe 文件 但是当我想运行时 显示错误消息 Windows cannot verify the digital signature for this file I get a Windows 8
  • sqlParameters vs string.Format 哪个更能提高速度?

    sqlParameters vs string Format 哪个更能提高速度 在不承担安全性的情况下 cmd CommandText INSERT INTO tbl test VALUES a b SqlParameter SqlPara
  • Python 中类方法的区别:绑定、非绑定和静态

    以下类方法有什么区别 难道一个是静态的 另一个不是 class Test object def method one self print Called method one def method two print Called meth
  • 命令行 Windows 挂在 RDP Windows 中

    我们定期通过 RDP 访问构建机器 并且会打开许多 命令行窗口 有时 这些窗口会挂起 就像有人将焦点切换到它们并按下暂停键一样 敲击键盘会推动整个过程 但偶尔会错过这个过程 每个人都在等待过程完成 同时等待有人按下按键 为什么会出现这种情况
  • 使用 Apache BeanUtils 将字符串转换为枚举

    我已经为 Apache BeanUtils 库实现了一个转换器 用于将 String 转换为枚举常量 class EnumConverter implements Converter Override public