1

在测试过程中,我发现我的 avro 消息反序列化器对于某些测试模式失败了。很长一段时间,这让我完全困惑。所以我的 avro 反序列化器反序列化someNameSpace.someType类,存储在 GenericRecord 返回值中。然后它被强制转换为 [same] someNameSpace.someType,但它失败了。为什么?微不足道,因为不同的类加载器。

但为什么只有这个测试模式?我了解到,所有本地存在的文件都将由这个类加载器加载。好的,对于某些资源,我不会对此感到惊讶,但这里的情况有点不同。

Maven-avro-plugin 将 avsc 文件,generate-sources同相编译出 java 文件。然后这个文件被编译成 .class 文件,反序列化器通过 avsc 文件被初始化。到目前为止,一切都很好。然后新消息到达。它被appClassLoader反序列化,而从GenericRecord标准转换完成的实际类转换(someNameSpace.someType)失败,因为someNameSpace.someType是由重新启动类加载器加载的。非常令人惊讶的是,使用 PathMatchingResourcePatternResolver (≈Class.getResourceAsStream) 读取的 avsc 资源是由 AppClassLoader 加载的,而从中构建的类文件是使用重启类加载器加载的。

问题:a)spring restart 类加载器应该加载类文件吗?b)我没有发现是否有人可以排除某些类文件被这个类加载器处理。我找到了资源的操作方法,但没有找到类文件... c) 有人遇到过这种行为吗?它只是我这边的某种错误配置,还是你做了什么解决这个问题(除了删除 spring-boot-devtools)

想法版本:193.5662.53 春季版本:2.0.4

谢谢!

4

0 回答 0