【发布时间】:2018-01-14 01:15:10
【问题描述】:
如果我尝试反序列化以下存储为字符串的类型:
List<Entry<String, String>> entryList;
entryList 包含的位置:
[{"dummyKey1":"dummyValue1"}]
我收到以下错误
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of java.util.Map$Entry, problem: abstract types either need to be mapped to concrete types, have custom deserializer, or be instantiated with additional type information.
在junit中运行测试用例时出现上述错误,但如果我删除测试用例,那么在部署后一切运行正常:
运行 junit 测试用例时出现上述错误,因为 Entry 中没有 NoArgsConstructor。所以,我创建了一个带有 NoArgsConstructor 的 DummyEntry,它以 null 为参数调用 Entry。
DummyEntry<K, V> extends SimpleEntry<K, V>
进行此更改后,没有出现上述错误,但在部署更改后我开始出现以下错误。
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
Unrecognized field "dummyKey1", not marked as ignorable (2 known properties: "value", "key"]).
为什么一种方法不适用于junit,但在生产中有效,而另一种方法在junit中有效但在生产中无效。
另外,我注意到另外一件事:在生产中, Map.Entry 被序列化为
{'dummyKey1':'dummyValue1'}
而 junit 中的测试用例序列化与
相同的字符串 {'key':'dummyKey1', 'value':'dummyValue1'}
这种奇怪行为的原因是什么?我怎样才能让这件事对双方都有效?
【问题讨论】:
-
在 (a) 生产和 (b) 您的测试用例中使用的是什么版本的 jackson-databind 库?
标签: serialization junit jackson deserialization junit4