【发布时间】:2021-12-26 15:03:12
【问题描述】:
前段时间我实现了一个CustomCharacterEscapeHandler,它在 Wildfly-18.0.1 之前运行良好。现在更新到 Wildfly 19 或更高版本时,出现以下异常:
javax.xml.bind.PropertyException: property "com.sun.xml.bind.marshaller.CharacterEscapeHandler" must be an instance of type com.sun.xml.bind.marshaller.CharacterEscapeHandler, not my.package.CustomCharacterEscapeHandler
at com.sun.xml.bind.v2.runtime.MarshallerImpl.setProperty(MarshallerImpl.java:489)
但我的 CustomCharacterEscapeHandler 完全实现了上述接口!
maven pom.xml 看起来像这样:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.12</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-xjc</artifactId>
<version>2.2.11</version>
</dependency>
我进行了很多研究,并尝试了所有我能找到的解决方案(1、2、3、4、5)但许多问题仍未得到解答(6、@987654328 @,8,9,10) 和提到的事情没有奏效。所以我尝试了:
- 添加了包含
javax.xml.bind.context.factory=com.sun.xml.bind.v2.ContextFactory的 jaxb.properties - 更新到较新的 JAXB 版本
- 添加了启动属性
-Djavax.xml.bind.context.factory=com.sun.xml.bind.v2.ContextFactory - 将 EscapHandler 添加为内联代码
jaxbMarshaller.setProperty(CharacterEscapeHandler.class.getName(), (CharacterEscapeHandler) (chars, start, length, b, writer) -> ... ); - 尝试在
jboss-deployment-structure(com.sun.xml.bind、javax.xml.bind.api、...)中添加排除项,并尝试相反的方式将它们添加为依赖项
但是到目前为止没有任何效果。任何想法如何解决这个问题?
【问题讨论】:
-
可能是类加载问题,一个可行的选项是设置所有 jaxb 依赖项
-
这是不可能的,因为部署包部署在许多不同的 JEE 应用服务器 Wildfly、jboss、websphere、weblogic ...)上,有时还部署在不同版本的服务器上。解决办法只能是排除wildfly提供的包...