【问题标题】:PropertyException after wildfly update: property CharacterEscapeHandler must be an instance of type CharacterEscapeHandlerWildfly 更新后的 PropertyException:属性 CharacterEscapeHandler 必须是 CharacterEscapeHandler 类型的实例
【发布时间】: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) -&gt; ... );
  • 尝试在jboss-deployment-structure(com.sun.xml.bind、javax.xml.bind.api、...)中添加排除项,并尝试相反的方式将它们添加为依赖项

但是到目前为止没有任何效果。任何想法如何解决这个问题?

【问题讨论】:

  • 可能是类加载问题,一个可行的选项是设置所有 jaxb 依赖项
  • 这是不可能的,因为部署包部署在许多不同的 JEE 应用服务器 Wildfly、jboss、websphere、weblogic ...)上,有时还部署在不同版本的服务器上。解决办法只能是排除wildfly提供的包...

标签: java jaxb wildfly


【解决方案1】:

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

  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?没用...

【讨论】:

    猜你喜欢
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    相关资源
    最近更新 更多