JAXB / Java 11 / Tomcat - DataHandler 无默认构造函数

JAXB / Java 11 / Tomcat - DataHandler No default constructor

我在使用 JAXB 时遇到了一些问题,我发现它存在许多实现,我使用了 JBoss 并且代码运行良好 (Metro JAXB),现在使用 tomcat 和 com.sun.xml.bind.. 它没有,它不能将 Base64 编码的字符串转换为 DataHandler。现在我再次重新编译它,我正在尝试 @XMLAttachmentRef 是否能解决我的问题。

[com.sun.xml.bind.v2.ClassFactory]  No default constructor found on class javax.activation.DataHandler
java.lang.NoSuchMethodException: javax.activation.DataHandler.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3349)
    at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2553)
    at com.sun.xml.bind.v2.ClassFactory.tryGetDeclaredConstructor(ClassFactory.java:107)

我的理解是它失败了,因为 DataHandler 没有 null args 构造函数。

我正在使用 OSGI 我问自己是否可以通过删除 com.sun.xml.bind 来更改 JAXB 并添加一些其他 jar 来注入它?

经过 > 10 小时的调试,我找到了原因:

Class TypeInfoSetImpl 方法 getTypeInfo 这里使 JAXB 查找哈希图中的内置类型,它将 class 类型与 hashcode() 进行比较,但我的两个 javax.activation.DataHandler 有两个不同的 classloader,这导致它们是不同的,所以它返回 null 并且 class javax.activation.DataHandler 被重新定义为可以使用 null args 构造函数实例化的 pojo 自定义 class。

删除第二个 jar 解决了我的问题。