我在使用 JAXB 时遇到了一些麻烦,我发现它存在许多实现,我使用了 JBoss 并且代码运行良好(Metro JAXB),现在使用 tomcat 和 com.sun.xml.bind.. 它没有t,它无法将 Base64 编码的 String 转换为 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 来注入(inject)它?
最佳答案
经过超过 10 个小时的调试,我找到了原因:
类 TypeInfoSetImpl 方法 getTypeInfo 这里使 JAXB 查找 hashmap 中的内置类型,它将类类型与 hashcode() 进行比较,但是我的两个 javax.activation.DataHandler 有两个不同的类加载器,这导致它们不同,因此它返回 null 和javax.activation.DataHandler 类被重新定义为 pojo 自定义类,可以使用 null args 构造函数实例化。
删除第二个 jar 解决了我的问题。
关于java - JAXB/Java 11/Tomcat - DataHandler 无默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61612982/