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 解决了我的问题。
我在使用 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 解决了我的问题。