我正在将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
数据绑定到Category模型对象,但这是我收到反序列化错误的地方(下面完全显示了错误日志)。
类别模型如下所示。
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]
我在哪里出错了?
答案 0 :(得分:0)
碰到同样的问题。 (看起来您使用的是比我新的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);
希望这至少能给您一个方向的提示...祝你好运!