2

Jerkson 开始抛出一个我以前从未见过的非常奇怪的错误。

com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class scala.runtime.BoxedUnit and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: scala.collection.MapWrapper["data"])

我正在从 API 解析一些基本数据。我定义的类是:

case class Segmentation(
  @(JsonProperty@field)("legend_size")
  val legend_size: Int,

  @(JsonProperty@field)("data")
  val data: Data

) 

看起来Data像:

case class Data(
  @(JsonProperty@field)("series")
  val series: List[String],

  @(JsonProperty@field)("values")
  val values: Map[String, Map[String, Any]]

)

任何线索为什么这会触发错误?似乎是 Jerkson 可以处理的简单类。

编辑:样本数据:

{"legend_size": 1, "data": {"series": ["2013-04-06", "2013-04-07", "2013-04-08", "2013-04-09", "2013-04-10", "2013-04-11", "2013-04-12", "2013-04-13", "2013-04-14", "2013-04-15"], "values": {"datapoint": {"2013-04-12": 0, "2013-04-15": 4, "2013-04-14": 0, "2013-04-08":
0, "2013-04-09": 0, "2013-04-11": 0, "2013-04-10": 0, "2013-04-13": 0, "2013-04-06": 0, "2013-04-07": 0}}}}
4

3 回答 3

3

这不是上述示例的答案,但我将提供它,因为它是我类似的“BoxedUnit”场景的答案:

No serializer found for class scala.runtime.BoxedUnit and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

就我而言,杰克逊抱怨反序列化 scala.runtime.BoxedUnit 对象的实例。

问:那么什么是 scala.runtime.BoxedUnit?

A:它是“Unit”的scala java表示。Jackson 的核心部分(即 java 代码)试图反序列化 scala Unit 非实体的 java 表示。

问:那为什么会这样呢?

答:在我的情况下,这是由带有未声明返回值的错误方法引起的下游副作用。有问题的方法包装了一个匹配子句(无意中)没有为每种情况返回一个值。由于上面描述的错误代码,Scala 动态地将捕获此方法结果的 var 声明为“Unit”。稍后在代码中,当此 var 序列化为 json 时,会发生杰克逊错误。

因此,如果您遇到这样的问题,我的建议是检查任何具有未定义返回值的隐式类型变量/方法,并确保它们正在做您认为他们正在做的事情。

于 2016-06-23T22:43:50.803 回答
0

我也有同样的例外。在我的情况下导致它的原因是我在没有'='的伴随对象中定义了一个应用方法:

object Somthing {
   def apply(s: SomthingElse)  {
      ...
   }
}

代替

object Somthing {
   def apply(s: SomthingElse) = {
      ...
   }
}

这导致应用方法返回类型为 Unit,当我将对象传递给杰克逊时导致异常。不确定您的代码中是否是这种情况,或者这个问题是否仍然相关,但这可能会帮助其他人解决此类问题。

于 2014-03-11T02:16:43.667 回答
0

自从我第一次发布这个问题以来已经有一段时间了。撰写此答案时的解决方案似乎是从 Jerkson 继续前进,并将 Jackson-module-scala 或 Json4s 与 Jackson 后端一起使用。许多 Scala 类型都包含在默认的序列化中并且是本地处理的。

另外,我看到的原因BoxedUnit是因为 Jerkson 看到的显式类型是Any(的一部分Map[String, Map[String, Any]])。Any是一个基本类型,不提供 Jerkson/Jackson 关于它正在反序列化的信息。因此,它抱怨缺少序列化程序。

于 2016-06-23T21:59:22.560 回答