wildfly 更新后的 PropertyException:属性 CharacterEscapeHandler 必须是 CharacterEscapeHandler 类型的实例
PropertyException after wildfly update: property CharacterEscapeHandler must be an instance of type CharacterEscapeHandler
前段时间我实现了一个 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, , 3, , 5) but many questions remain unanswered (6,7,8,9,10),但提到的方法没有用。所以我尝试了:
- 添加了 jaxb.properties 包含
javax.xml.bind.context.factory=com.sun.xml.bind.v2.ContextFactory
- 更新到较新的 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、...)中添加排除项,还尝试将它们添加为依赖项
然而到目前为止没有任何效果。有什么解决办法吗?
我找到了两个可行的解决方案:
- 将启动 属性 添加到 wildfly 启动脚本
-Djavax.xml.bind.JAXBContextFactory=com.sun.xml.bind.v2.ContextFactory
- 将我的应用程序的 JAXB 库与 wildfly JAXB 库对齐
第二个解决方案的背景和一些细节:
wildfly 19中使用的JAXB已更新(cp.1,2)。
由于没有任何效果,我开始调试它。首先是 wildfly 18 上的工作版本,然后是非工作版本。对应的代码是:
MarshallerImpl.java:
...
if( ENCODING_HANDLER.equals(name) || ENCODING_HANDLER2.equals(name)) {
if(!(value instanceof CharacterEscapeHandler)) //<- fails here!
throw new PropertyException(
Messages.MUST_BE_X.format(
name,
CharacterEscapeHandler.class.getName(),
value.getClass().getName() ) );
escapeHandler = (CharacterEscapeHandler)value;
return;
}
但是对于非工作版本,调试器跳入了一个明显不正确的区域,因此我知道使用了不同版本的 JAXB。
所以我做了以下事情:
- 我检查了 wildfly 捆绑的 jaxb 版本。
WILDFLY_HOME/modules/system/layers/base/com/sun/xml/bind/main
- 我在
pom.xml
文件中使用了完全相同的版本
=> 然后成功了!
我不明白的是,我尝试排除 wildfly-packaged-jaxb 但这没有帮助。所以这仍然是一个谜,为什么我通过 jboss-deployment-structure 排除了 JAXB?没用...
前段时间我实现了一个 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,
- 添加了 jaxb.properties 包含
javax.xml.bind.context.factory=com.sun.xml.bind.v2.ContextFactory
- 更新到较新的 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、...)中添加排除项,还尝试将它们添加为依赖项
然而到目前为止没有任何效果。有什么解决办法吗?
我找到了两个可行的解决方案:
- 将启动 属性 添加到 wildfly 启动脚本
-Djavax.xml.bind.JAXBContextFactory=com.sun.xml.bind.v2.ContextFactory
- 将我的应用程序的 JAXB 库与 wildfly JAXB 库对齐
第二个解决方案的背景和一些细节:
wildfly 19中使用的JAXB已更新(cp.1,2)。 由于没有任何效果,我开始调试它。首先是 wildfly 18 上的工作版本,然后是非工作版本。对应的代码是:
MarshallerImpl.java:
...
if( ENCODING_HANDLER.equals(name) || ENCODING_HANDLER2.equals(name)) {
if(!(value instanceof CharacterEscapeHandler)) //<- fails here!
throw new PropertyException(
Messages.MUST_BE_X.format(
name,
CharacterEscapeHandler.class.getName(),
value.getClass().getName() ) );
escapeHandler = (CharacterEscapeHandler)value;
return;
}
但是对于非工作版本,调试器跳入了一个明显不正确的区域,因此我知道使用了不同版本的 JAXB。 所以我做了以下事情:
- 我检查了 wildfly 捆绑的 jaxb 版本。
WILDFLY_HOME/modules/system/layers/base/com/sun/xml/bind/main
- 我在
pom.xml
文件中使用了完全相同的版本
=> 然后成功了!
我不明白的是,我尝试排除 wildfly-packaged-jaxb 但这没有帮助。所以这仍然是一个谜,为什么我通过 jboss-deployment-structure 排除了 JAXB?没用...