2014-12-03 76 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>