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}}}}
答案 0 :(得分:2)
这不是上述例子的答案,但我会提供它,因为它是我类似的#BoxfulUnit"情形:
No serializer found for class scala.runtime.BoxedUnit and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
在我的案例中,Jackson抱怨反序列化scala.runtime.BoxedUnit对象的实例。
问:那么什么是scala.runtime.BoxedUnit?答:" Unit"的scala java表示。 Jackson的核心部分(java代码)试图反序列化scala Unit非实体的java表示。
问:那为什么会这样呢?答:在我的情况下,这是由具有未申报的返回值的错误方法引起的下游副作用。有问题的方法包含了一个匹配条款(无意中)没有为每个案例返回一个值。由于上面描述的错误代码,Scala动态地声明var捕获此方法的结果为" Unit"。稍后在代码中将此序列化为json时,会发生jackson错误。
因此,如果您遇到这样的问题,我的建议是检查任何带有未定义返回值的隐式类型变量/方法,并确保它们正在执行您认为正在执行的操作。
答案 1 :(得分:0)
我有同样的例外。在我的情况下导致它的原因是我在没有'='的伴随对象中定义了一个apply方法:
object Somthing {
def apply(s: SomthingElse) {
...
}
}
而不是
object Somthing {
def apply(s: SomthingElse) = {
...
}
}
这导致apply方法返回类型为Unit,当我将对象传递给jackson时导致异常。 不确定您的代码中是否存在这种情况,或者此问题是否仍然相关,但这可能会帮助其他人解决此类问题。
答案 2 :(得分:0)
自从我第一次发布这个问题以来已经有一段时间了。写这个答案时的解决方案似乎是从Jerkson继续前进,并使用Jackson-module-scala或Json4s与Jackson后端。许多Scala类型都包含在默认序列化中,并且是本机处理的。
此外,我看到BoxedUnit
的原因是因为Jerkson看到的显式类型是Any
(Map[String, Map[String, Any]]
的一部分)。 Any
是一种基本类型,并没有给Jerkson / Jackson提供有关它反序列化的信息。因此,它抱怨缺少序列化器。