WildFly 中与 EAR 部署冲突的 jackson-jaxrs 提供程序
Conflicting jackson-jaxrs provider in WildFly with EAR deployment
我们在 WildFly 9 上有一个 Java EE 7 应用程序 运行,由一个展开的 EAR 部署组成,其中包含几个 WAR 文件、一些 EAR 级别的 JAR 和一个包含第 3 个 JAR 的 lib 文件夹。 (我知道这不是今天的人会做的,但它就是这样。)
WAR 之一包含 JAX-RS REST 服务,该服务获取和发布包含 Java 8 OffsetDateTime
的数据对象。由于 JSON-B 尚不可用,我们使用 @JsonSerialize
/@JsonDeserialize
形式 jackson-databind 以便将其编组到 JSON。
这工作得很好,直到由于另一个 WAR 的更改,依赖项 jackson-jaxrs 进入 EAR 级别的 lib 文件夹。然后发生的事情是编组停止工作,因为容器试图将 JSON 中的日期字符串直接设置为 OffsetDateTime
类型,并在获取它时写入 [=29= 的所有内部字段] 8 日期而不是格式化字符串。
我假设,上述注释的处理没有发生,因此服务器试图像其他简单类型一样映射它。当我删除属于 jackson-jaxrs 依赖项的 JAR 后,一切又恢复正常了。然后应用程序服务器可能使用它自己的模块文件夹中的这个 JAR 版本。
所以,我的问题是:在 EARs lib 文件夹中除了系统提供的模块之外还有 jackson-jaxrs JAR 有什么区别?为什么在de/serializing时不考虑第一种情况的annontaions?
Wildfly 9 将 jackson 1.9 捆绑为基本模块,注释位于 org.codehaus.jackson
包中。
我怀疑最近添加的库是(更新的)jackson 2.x 并且注释现在位于 com.fasterxml.jackson
包中。
如果是这种情况,升级到 jackson 2.x(最好是与您从 EAR 获得的版本相同的版本)应该可以解决问题。
或者,将您的子部署与 EAR 中存在的 jackson jar 隔离可能有效,但它可能会因传递依赖性而变得混乱。参见 class loading in Wildfly
编辑 如您所确认,有两个不同的版本运行。如果你负担得起,调整版本将最有助于解决问题。
除此之外,您可能需要隔离每个子部署,以便它只能看到预期的版本。例如,参见 (将整个部署与基本模块隔离)。
我们在 WildFly 9 上有一个 Java EE 7 应用程序 运行,由一个展开的 EAR 部署组成,其中包含几个 WAR 文件、一些 EAR 级别的 JAR 和一个包含第 3 个 JAR 的 lib 文件夹。 (我知道这不是今天的人会做的,但它就是这样。)
WAR 之一包含 JAX-RS REST 服务,该服务获取和发布包含 Java 8 OffsetDateTime
的数据对象。由于 JSON-B 尚不可用,我们使用 @JsonSerialize
/@JsonDeserialize
形式 jackson-databind 以便将其编组到 JSON。
这工作得很好,直到由于另一个 WAR 的更改,依赖项 jackson-jaxrs 进入 EAR 级别的 lib 文件夹。然后发生的事情是编组停止工作,因为容器试图将 JSON 中的日期字符串直接设置为 OffsetDateTime
类型,并在获取它时写入 [=29= 的所有内部字段] 8 日期而不是格式化字符串。
我假设,上述注释的处理没有发生,因此服务器试图像其他简单类型一样映射它。当我删除属于 jackson-jaxrs 依赖项的 JAR 后,一切又恢复正常了。然后应用程序服务器可能使用它自己的模块文件夹中的这个 JAR 版本。
所以,我的问题是:在 EARs lib 文件夹中除了系统提供的模块之外还有 jackson-jaxrs JAR 有什么区别?为什么在de/serializing时不考虑第一种情况的annontaions?
Wildfly 9 将 jackson 1.9 捆绑为基本模块,注释位于 org.codehaus.jackson
包中。
我怀疑最近添加的库是(更新的)jackson 2.x 并且注释现在位于 com.fasterxml.jackson
包中。
如果是这种情况,升级到 jackson 2.x(最好是与您从 EAR 获得的版本相同的版本)应该可以解决问题。
或者,将您的子部署与 EAR 中存在的 jackson jar 隔离可能有效,但它可能会因传递依赖性而变得混乱。参见 class loading in Wildfly
编辑 如您所确认,有两个不同的版本运行。如果你负担得起,调整版本将最有助于解决问题。
除此之外,您可能需要隔离每个子部署,以便它只能看到预期的版本。例如,参见