我的项目中的整个模块我使用的是用 Java 编写的核心库。其中一个模块是用 Scala ( Scalatra 框架)编写的。
在某些时候我需要使用核心库的类: net.example.MyClass ,并将其序列化为String。在用Java编写的模块中,这很好用,但在Scala中我遇到了以下异常:
org.json4s.package$MappingException: Can't find ScalaSig for class net.example.MyClass
at org.json4s.reflect.ScalaSigReader$.findClass(ScalaSigReader.scala:42) ~[json4s-core_2.11-3.2.10.jar:3.2.10]
at org.json4s.reflect.ScalaSigReader$.org$json4s$reflect$ScalaSigReader$$read$1(ScalaSigReader.scala:36) ~[json4s-core_2.11-3.2.10.jar:3.2.10]
...
net.exmample.MyClass 是使用Builder模式创建的,使用的注释:@JsonDeserialize(builder = MyClass.Builder.class)。
我想这可能会使用反射或@JsonDeserialize注释未处理。有没有人遇到类似的错误,是否有解决方案,或我可以检查的文件?任何帮助将不胜感激。
感谢名单!
使用:
- Java 8
- Scala 2.11.0
- Scalatra 2.3.0
- json4s-jackson 3.2.10 用于序列化为String
答案 0 :(得分:0)
最后,我通过更改JSON值的创建方式来解决错误。而不是使用json4s包装器:
org.json4s.jackson.Serialization.write()
我转而直接使用Jackson mapper:
com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString()
修改强>:
在我的ScalatraBootstrap.init()
方法中,我定义了Jackson的 ObjectMapper :
import com.fasterxml.jackson.databind.ObjectMapper
class ScalatraBootstrap extends LifeCycle {
override def init(context: ServletContext) {
implicit val objectMapper = new ObjectMapper
//omitting the rest of the code...
}
...
}
这是我的服务类,我正在获取net.example.MyClass
并使用 ObjectMapper 将其转换为JSON:
import net.example.MyClass
import com.fasterxml.jackson.databind.ObjectMapper
class MyService(val objectMapper: ObjectMapper) {
def getMyClassAsJson() {
val result: MyClass = // calling a service which provides the MyClass object
return objectMapper.writeValueAsString(result)
}
}
答案 1 :(得分:0)
你发布了包含net.example.MyClass[]
的json。由于MyClass[]
是一个数组,ScalaSig无法解析对象数组,因此您应该使用ArrayList<net.example.MyClass>
。