2017-04-23 36 views
1

我从2.11升级我的版本斯卡拉的2.12和对象映射器似乎打破。我的代码的其他部分需要仅在2.12下提供的功能。有没有办法阻止斯卡拉2.12打破了杰克逊对象映射?

using scala 2.12 with spark 2.1提到重建杰克逊作为一个可能的解决方案。这是真的必要还是有一个更简单的解决方案?

SBT配置的Scala 2.11.0

// Identity 
name := "ScalaJsonSpike00" 
organization := "com.acme" 

// Versions 
version := "1.0" 
scalaVersion := "2.11.0" 

// Scala test 
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.0" % "test" 

// JSON 
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind 
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.8.8" 
// https://mvnrepository.com/artifact/com.fasterxml.jackson.module/jackson-module-scala_2.11 
libraryDependencies += "com.fasterxml.jackson.module" % "jackson-module-scala_2.11" % "2.8.8" 

代码既2.11和2.12

import com.fasterxml.jackson.databind.ObjectMapper 
import com.fasterxml.jackson.module.scala.DefaultScalaModule 
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper 

object Main { 
    def main(args: Array[String]): Unit = { 

    val originalMap = Map("a" -> List(1,2), "b" -> List(3,4,5), "c" -> List()) 
    val mapper = new ObjectMapper() with ScalaObjectMapper 
    mapper.registerModule(DefaultScalaModule) 
    println(mapper.writeValueAsString(originalMap)) 
    } 
} 

结果使用Scala 2.11.0

{"a":[1,2],"b":[3,4,5],"c":[]} 

SBT配置更新到2.12阶0.1

scalaVersion := "2.12.1" 

结果使用Scala 2.12.1

com.intellij.rt.execution.application.AppMain Main 
Exception in thread "main" java.lang.NoSuchMethodError: com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper.$init$(Lcom/fasterxml/jackson/module/scala/experimental/ScalaObjectMapper;)V 
    at Main$$anon$1.<init>(Main.scala:9) 
    at Main$.main(Main.scala:9) 
    at Main.main(Main.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
+0

我无法找到使用Scala的2.12火花2.1 ** **在杰克逊重建任何提及。你真的想要链接这个特定的问题吗? – Suma

+0

对不起,你是对的。我指的是此评论“是啊,但如果斯卡拉2.11不与2.12二进制兼容的怎么能行吗?”并错过了它应用到杰克逊。很多搜索后很累。 –

回答

2

您应该使用%%获得jackson-module-scala:适合您的Scala版本:

libraryDependencies += "com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.8.8" 

在当前的版本中,你总是使用Scala的2.11版本的这模块,它与Scala 2.12不是二进制兼容的。

有没有这样的问题,与核心杰克逊库,那些像Java的,因此不会受到斯卡拉版本以任何方式。

+0

谢谢我将配置更新为以下内容: 'libraryDependencies + =“com.fasterxml.jackson.module”%%“jackson-module-scala”%“ –