2014-12-03 80 views
0

在我的项目中的所有模块中,我正在使用在Java中编写的核心库。其中一个模块已经写入ScalaScalatra框架)。找不到类ScalaSig

在某些时候,我需要使用核心库的类:net.example.MyClass,并将其序列化为字符串。在用Java编写的模块,这工作得很好,但在斯卡拉我遇到以下情况例外:

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(建设者= MyClass的.Builder.class)。

我想这可能会做反射或@JsonDeserialize注释没有被处理。有没有人遇到类似的错误,是否有解决方案,或者我可以检查的文档?任何帮助,将不胜感激。

Thanx!

使用:
- 的Java 8
- 斯卡拉2.11.0
- 了Scalatra 2.3.0
- json4s - 杰克逊3.2.10序列化到字符串

回答

0

最后,我通过更改JSON值的创建方式来解决错误。除了使用json4s包装的:

org.json4s.jackson.Serialization.write()

我切换到使用直接杰克逊映射:

com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString()

编辑: 在我ScalatraBootstrap.init()的方法,我已经定义了杰克逊的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并将其转变成JSON与ObjectMapper

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) 
    } 
} 
0

您发布JSON包括net.example.MyClass[]。由于MyClass[]是一个数组,因此ScalaSig无法解析对象数组,因此您应该使用ArrayList<net.example.MyClass>