5

我正在解析一个 XML 字符串,以使用Jackson 库中的 a 将其转换为JsonNodeScala 中的 a 。XmlMapper我在 Databricks 笔记本上编码,因此编译是在云集群上完成的。在编译我的代码时,我收到java.lang.NoSuchMethodError: com.fasterxml.jackson.dataformat.xml.XmlMapper.coercionConfigDefaults()Lcom/fasterxml/jackson/databind/cfg/MutableCoercionConfig;了一百行“at com.databricks....”的错误。

我可能忘记导入一些东西,但对我来说这没关系(如果我错了告诉我):

import ch.qos.logback.classic._
import com.typesafe.scalalogging._
import com.fasterxml.jackson._
import com.fasterxml.jackson.core._
import com.fasterxml.jackson.databind.{ObjectMapper, JsonNode}
import com.fasterxml.jackson.dataformat.xml._
import com.fasterxml.jackson.module.scala._
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import java.io._
import java.time.Instant
import java.util.concurrent.TimeUnit
import javax.xml.parsers._
import okhttp3.{Headers, OkHttpClient, Request, Response, RequestBody, FormBody}
import okhttp3.OkHttpClient.Builder._
import org.apache.spark._
import org.xml.sax._

当我使用 Databricks 时,没有用于依赖项的 SBT 文件。相反,我直接在集群上安装了我需要的库。这是我正在使用的:

com.squareup.okhttp:okhttp:2.7.5
com.squareup.okhttp3:okhttp:4.9.0
com.squareup.okhttp3:okhttp:3.14.9
org.scala-lang.modules:scala-swing_3:3.0.0
ch.qos.logback:logback-classic:1.2.6
com.typesafe:scalalogging-slf4j_2.10:1.1.0
cc.spray.json:spray-json_2.9.1:1.0.1
com.fasterxml.jackson.module:jackson-module-scala_3:2.13.0
javax.xml.parsers:jaxp-api:1.4.5
org.xml.sax:2.0.1

导致错误的代码很简单(来自这里:https ://www.baeldung.com/jackson-convert-xml-json Chapter 5):

val xmlMapper: XmlMapper = new XmlMapper()
val jsonNode: JsonNode = xmlMapper.readTree(responseBody.getBytes())

withresponseBody是一个包含 XML 文档的字符串(我之前检查了 XML 的完整性)。删除这两行时,代码工作正常。

我已经阅读了大量文章或论坛,但我无法弄清楚是什么导致了我的问题。有人可以帮帮我吗 ?非常感谢 !:)

4

2 回答 2

5

欢迎来到依赖地狱和库中的重大变化。

这通常发生在不同的库引入不同版本的相同库时。在这种情况下,它是杰克逊。 java.lang.NoSuchMethodError: com.fasterxml.jackson.dataformat.xml.XmlMapper.coercionConfigDefaults()Lcom/fasterxml/jackson/databind/cfg/MutableCoercionConfig;意思是:一个库可能需要杰克逊版本,它有这个方法,但在类路径上是版本,它还没有这个功能或被删除 bcs 已被弃用或重命名。

如果像这样打印依赖树并检查库中所需的 Jackson 版本很好。如果可能,请使用更新版本的 quid 库。

解决方案:使用 libs,它使用兼容版本的 Jackson lib。没有其他捷径可能。

于 2021-10-07T12:01:15.043 回答
0

升级到 2.12.5 版本解决了我的问题。当项目 lib 目录中有多个版本的 jackson jar 时,也可能出现此问题。您应该删除旧版本。

于 2022-02-09T12:31:14.430 回答