无法在课堂上找到ScalaSig

时间:2014-12-03 10:45:21

标签: java scala

我的项目中的整个模块我使用的是用 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

2 个答案:

答案 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>