Can not find a deserializer for non-concrete Map type [map type; class javax.ws.rs.core.MultivaluedMap

这一生的挚爱 提交于 2019-12-22 08:59:44

问题


I'm having the following issue in Deserialization with org.codehaus.jackson.map.ObjectMapper that does not work for the following class. I'm not sure what is going wrong with the MultivaluedMap I'm using.

 public class ClassD
 {
    private ClassA objA;
    private ClassB objB;
    private final ClassC objC;
    private MultivaluedMap<String, String> headerMap;
 }

public static void main(String[] args) {
    String fileName = "someFilePath";
    mockCollection = fromJSON(new TypeReference<Collection<ClassD>>() {}, new String(Files.readAllBytes(Paths.get(fileName)), StandardCharsets.UTF_8));
}

public static <T> T fromJSON(final TypeReference<T> type, final String jsonPacket) throws JsonParseException, JsonMappingException, IOException {
       T data = null;
       ObjectMapper om = new ObjectMapper();
       om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
       data = om.readValue(jsonPacket, type);
       return data;
    }


Exception : 
org.codehaus.jackson.map.JsonMappingException: Can not find a deserializer for non-concrete Map type [map type; class javax.ws.rs.core.MultivaluedMap, [simple type, class java.lang.String] -> [collection type; class java.util.List, contains [simple type, class java.lang.String]]]
    at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:315)
    at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:290)
    at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:159)
    at org.codehaus.jackson.map.deser.std.StdDeserializer.findDeserializer(StdDeserializer.java:620)
    at org.codehaus.jackson.map.deser.BeanDeserializer.resolve(BeanDeserializer.java:379)
    at org.codehaus.jackson.map.deser.StdDeserializerProvider._resolveDeserializer(StdDeserializerProvider.java:407)
    at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:352)
    at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:290)
    at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:159)
    at org.codehaus.jackson.map.deser.BasicDeserializerFactory.createCollectionDeserializer(BasicDeserializerFactory.java:284)
    at org.codehaus.jackson.map.deser.StdDeserializerProvider._createDeserializer(StdDeserializerProvider.java:389)
    at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCache2(StdDeserializerProvider.java:310)
    at org.codehaus.jackson.map.deser.StdDeserializerProvider._createAndCacheValueDeserializer(StdDeserializerProvider.java:290)
    at org.codehaus.jackson.map.deser.StdDeserializerProvider.findValueDeserializer(StdDeserializerProvider.java:159)
    at org.codehaus.jackson.map.deser.StdDeserializerProvider.findTypedValueDeserializer(StdDeserializerProvider.java:180)
    at org.codehaus.jackson.map.ObjectMapper._findRootDeserializer(ObjectMapper.java:2829)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2728)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1870)

回答1:


Posting the answer as people are facing the same issue. You can use this util to solve your issue

public static <T> T deserializeJson(final String json, final Class<T> clazz) throws JsonParseException, JsonMappingException, IOException {
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(JsonMethod.FIELD, Visibility.ANY);
    om.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
    return om.readValue(json, clazz);
}

public static <T> String serializeToJson(final T object) throws JsonGenerationException, JsonMappingException, IOException {
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(JsonMethod.FIELD, Visibility.ANY);
    return om.writeValueAsString(object);
}


来源:https://stackoverflow.com/questions/35468222/can-not-find-a-deserializer-for-non-concrete-map-type-map-type-class-javax-ws

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!