Mit TypeReference mit Jackson

Folgende test fehlschlägt,

java.util.LinkedHashMap cannot be cast to org.dabd.mapping2.MapperImplNGTest$Foo
java.lang.ClassCastException
    at org.dabd.mapping2.MapperImplNGTest.testFromMap(MapperImplNGTest.java:82)

Die einzige Lösung, die ich finden konnte, ist die änderung der fromMap Signatur T fromMap(S map, Class<T> clazz) aber ich glaube nicht, dass es notwendig ist, übergeben Sie die Klasse explizit. Ist das nicht die TypeReference genug Informationen zum instanziieren der Typ T? Danke.

import java.util.Map;

public interface Mapper<T extends Object, S extends Map<String, Object>> {
    public S toMap(T obj);
    public T fromMap(S map);
}


import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Map;

public class MapperImpl<T extends Object, S extends Map<String, Object>>
        implements Mapper<T, S> {

    public S toMap(T obj) {
        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Object> map = objectMapper.convertValue(obj, Map.class);
        return (S) map;
    }

    public T fromMap(S map) {
        ObjectMapper objectMapper = new ObjectMapper();
        T obj = objectMapper.convertValue(map, new TypeReference<T>() {
        });
        return obj;
    }

}

Test

import java.util.HashMap;
import java.util.Map;
import static org.testng.Assert.*;
import org.testng.annotations.Test;


public class MapperImplNGTest {

    public static class Foo {

        private String a;

        public String getA() {
            return a;
        }

        public void setA(String a) {
            this.a = a;
        }

    }

    public MapperImplNGTest() {
    }

    @Test
    public void testFromMap() {

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("a", "aa");

        MapperImpl<Foo, Map<String, Object>> mapper = new MapperImpl<Foo, Map<String, Object>>();
        Foo foo = mapper.fromMap(map);
        assertEquals(foo.getA(), map.get("a"));

    }

}

InformationsquelleAutor dmz73 | 2014-10-05

Schreibe einen Kommentar