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),但提到的方法没有用。所以我尝试了:

然而到目前为止没有任何效果。有什么解决办法吗?

我找到了两个可行的解决方案:

  1. 将启动 属性 添加到 wildfly 启动脚本 -Djavax.xml.bind.JAXBContextFactory=com.sun.xml.bind.v2.ContextFactory
  2. 将我的应用程序的 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。 所以我做了以下事情:

  1. 我检查了 wildfly 捆绑的 jaxb 版本。 WILDFLY_HOME/modules/system/layers/base/com/sun/xml/bind/main
  2. 我在 pom.xml 文件中使用了完全相同的版本

=> 然后成功了!

我不明白的是,我尝试排除 wildfly-packaged-jaxb 但这没有帮助。所以这仍然是一个谜,为什么我通过 jboss-deployment-structure 排除了 JAXB?没用...