gpt4 book ai didi

java - 找不到非具体 Map 类型的反序列化器 [map type; com.google.common.collect.ImmutableMap 类

转载 作者:行者123 更新时间:2023-12-04 02:52:50 30 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





JsonMappingException: Can not find a deserializer for non-concrete Map type

(1 个回答)


2年前关闭。




我正在使用 java 作为后端,从 UI 发送的请求在 JSON格式如下图。

{"name":"Music"}

下面是java代码。
@PostMapping(consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE},produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
public Category insertCategory(@RequestBody Category category) {
// TODO Auto-generated method stub
System.out.println("entity:" +category.getName());
CategoryServiceImpl impl = new CategoryServiceImpl();
Category res = impl.insertCategory(category);
return res;
}

返回给 UI 的响应应该是 json所以我使用了 MediaType.APPLICATION_JSON_VALUE 的产品正如你在上面看到的。

还请求正文绑定(bind) json数据到类别模型对象,但这是我得到反序列化错误的地方(错误日志完全显示在下面)。

类别模型如下所示。
public class Category extends Entity {
private ImmutableMap<String,Category> childCategories;

public ImmutableMap<String, Category> getChildCategories() {
return childCategories;
}
public void setCategories(Map<String,Category> categories) {
ImmutableMap.Builder<String, Category> builder = new ImmutableMap.Builder<String, Category>();
builder.putAll(categories);
childCategories = builder.build();
}
}

实体:
public class Entity {
private String id;
private String name;
private String description;
private String title;
private String icon;
}
//getters and setters method

由于发送的请求在 json格式,我收到反序列化错误,这是因为模型中使用了 map 。如果我在类别模型中评论 map 部分,它会起作用。

我想使用 map 而不是列表。但是如何通过将 map 本身保留在模型中来解决这个反序列化错误

错误日志如下所示。
org.springframework.web.HttpLogging : 
Failed to evaluate Jackson deserialization for type [[simple type, class com.hiya.model.Category]]

com.fasterxml.jackson.databind.JsonMappingException:
Cannot find a deserializer for non-concrete Map type [map type; class com.google.common.collect.ImmutableMap,
[simple type, class java.lang.String] -> [simple type, class com.hiya.model.Category]]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:306) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:268) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.DeserializationContext.findNonContextualValueDeserializer(DeserializationContext.java:467) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:473) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:293) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.deser.DeserializerCache.hasValueDeserializerFor(DeserializerCache.java:191) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.DeserializationContext.hasValueDeserializerFor(DeserializationContext.java:422) ~[jackson-databind-2.9.7.jar:2.9.7]
at com.fasterxml.jackson.databind.ObjectMapper.canDeserialize(ObjectMapper.java:2875) ~[jackson-databind-2.9.7.jar:2.9.7]

我在某个地方出错了吗?

最佳答案

刚刚遇到同样的问题。 (看起来你正在使用比我更新的 jackson ,但仍然应该工作)

你需要的是

<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-guava</artifactId>
<version>your version</version>
</dependency>

但是添加依赖是不够的。您还需要将 com.fasterxml.jackson.datatype.guava.GuavaModule.GuavaModule 类注册到 ObjectMapper 中。

我从您的示例代码中怀疑您正在使用某些框架。我不能帮助那个。

但是,如果我以编程方式构建 ObjectMapper 和所有内容,它看起来像这样:
ObjectMapper mapperWithGuavaSupport = new ObjectMapper().registerModule(new GuavaModule())
MyObjectContainsImmutableMap obj = mapperWithGuavaSupport.readValue("theJsonString", MyObjectContainsImmutableMap.class);

希望这至少能给你一个方向的提示......祝你好运!

关于java - 找不到非具体 Map 类型的反序列化器 [map type; com.google.common.collect.ImmutableMap 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54249568/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com