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)

私の場合、Jackson は scala.runtime.BoxedUnit オブジェクトのインスタンスをデシリアライズすることについて不平を言っていました。

Q: では、scala.runtime.BoxedUnit とは何ですか?

A: "Unit" の scala Java 表現です。Jackson のコア部分 (Java コード) は、scala Unit 非実体の Java 表現を逆シリアル化しようとしています。

Q: では、なぜこのようなことが起こったのですか?

A: 私の場合、これは宣言されていない戻り値を持つバグのあるメソッドによって引き起こされたダウンストリームの副作用でした。問題のメソッドは、(意図せずに)各ケースの値を返さなかった一致句をラップしました。上記のバグのあるコードのため、Scala はこのメソッドの結果をキャプチャする var を「Unit」として動的に宣言しました。コードの後半で、この var が json にシリアル化されると、jackson エラーが発生します。

したがって、このような問題が発生した場合は、戻り値が定義されていない暗黙的に型指定された vars / メソッドを調べて、思ったとおりに動作していることを確認することをお勧めします。

于 2016-06-23T22:43:50.803 に答える
0

私にも同じ例外がありました。私の場合、「=」なしでコンパニオンオブジェクトに適用メソッドを定義したことが原因です。

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

それ以外の

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

これにより、apply メソッドの戻り値の型が Unit になり、オブジェクトを jackson に渡したときに例外が発生しました。それがあなたのコードに当てはまるかどうか、またはこの質問がまだ関連しているかどうかはわかりませんが、これはこの種の問題で他の人を助けるかもしれません.

于 2014-03-11T02:16:43.667 に答える