【问题标题】:Cannot find a deserializer for non-concrete Map type [map type; class com.google.common.collect.ImmutableMap [duplicate]找不到非具体 Map 类型的反序列化器 [map type; com.google.common.collect.ImmutableMap 类 [重复]
【发布时间】:2019-01-18 07:38:54
【问题描述】:

我使用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 的产品,如上所示。

还请求正文将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 格式,我收到反序列化错误,这是因为模型中使用了映射。如果我在类别模型中评论地图部分,它会起作用。

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

错误日志如下所示。

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]

我是不是哪里出错了?

【问题讨论】:

    标签: java json rest


    【解决方案1】:

    刚刚遇到同样的问题。 (看起来你使用的 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);
    

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

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多