Collections$UnmodifiableMap类型转换出错问题

今天修改之前kafka消费者的代码,之前都是从properties中读取信息来创建AdminClient的,现在的配置是在xml文件中去读取properties的数据,然后在代码中直接注入对应的类——ConsumerFactory,直接用consumerFactory.getConfigurationProperties就可以了,但是在参数转换的时候报错了,具体信息如下:

(这几个字的作用是为了让右边的空隙小一点) java.lang.ClassCastException:java.util.Collections$UnmodifiableMap cannot be cast to scala.collection.immutable.Map/Properties/adminConfig

后面是因为我在idea代码提示下换了三个可以强制转换的类型,结果三个都是错的。查了些资料,都是介绍UnmodifiableMap的作用之类的,有的也不适合我这个。

后来找老司机来解决问题了,老司机还是厉害,分分钟就解决了问题。

之前代码很简单,就是这一句:

AdminClient adminClient = AdminClient.create((当时我在这里面换了三种类型来强转)cfgProp);

后来改成了这样子:

Map configurationProperties = consumerFactory.getConfigurationProperties();
Properties cfgProp = new Properties();
cfgProp.putAll(configurationProperties);
AdminClient adminClient = AdminClient.create(cfgProp);

点击putAll,直接跳到hashtable中的源码了,关于putAll()方法的源码:

public synchronized void putAll(Map t) {
    for (Map.Entry e : t.entrySet())
        put(e.getKey(), e.getValue());
}

(下面这段话是从网上查的)

因为 Properties 继承于 Hashtable,put 方法在Hashtable类中,所以可对 Properties 对象应用 put 和 putAll 方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。相反,应该使用 setProperty 方法。如果在“不安全”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。类似地,如果在“不安全”的 Properties 对象(即包含非 String 的键)上调用 propertyNames 或 list 方法,则该调用将失败。

我这边是因为有了报错信息,所以就直接从报错信息里找方法了,一直在纠结这个Collections$UnmodifiableMap怎么样才能转换,老司机过来后,没有处理Collections$UnmodifiableMap,没有强转,知道我是要得到properties文件后,去properties中找了一个putAll()的方法,可以把map的参数传进去,就这么轻易的解决了。

可能各位和我的错误不一样,但是希望各位能从老司机的思路里获得些灵感(这句话是对我自己说的)。

你可能感兴趣的:(代码片段)