杰克逊和子类内的泛型类型

时间:2017-09-18 17:34:31

标签: java generics jackson

我正在重写这个问题,因为我发现了代码中的实际错误。

这是我的问题的一个功能齐全的例子(我使用Jackson 2.9.0):

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import java.io.IOException;
import java.net.URL;
import java.util.List;

public class MainClass {

    public static class SubClass<TYPE> {
        private List<TYPE> values;

        public List<TYPE> getValues() {
            return values;
        }

        public void setValues(List<TYPE> values) {
            this.values = values;
        }
    }

    public static class Foo {
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

    private SubClass<Foo> propertyFoo;

    public SubClass<Foo> getPropertyFoo() {
        return propertyFoo;
    }

    public void setPropertyFoo(SubClass propertyFoo) {
        this.propertyFoo = propertyFoo;
    }

    public static void main(String args[]) throws IOException {
        URL url = System.class.getResource("/testFoo.json");
        ObjectMapper mapper = new ObjectMapper();
        ObjectReader reader = mapper.readerFor(MainClass.class);
        MainClass mainClass = reader.readValue(url);
        mainClass.getPropertyFoo().getValues().forEach(foo -> {
           System.out.println(String.format("name: %s", foo.getName()));
        });
    }
}

请注意缺少的类型参数:

public void setPropertyFoo(SubClass propertyFoo)

而不是

public void setPropertyFoo(SubClass<Foo> propertyFoo)

第一个表单编译但在运行时产生以下异常

Exception in thread "main" java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to MainClass$Foo

1 个答案:

答案 0 :(得分:0)

正如我在新编辑的帖子中写的那样,我的问题在于那个二传手。虽然它编译它是一个例外,因为杰克逊无法找到适合用于内部物体的类型。

修复

public void setPropertyFoo(SubClass propertyFoo)

public void setPropertyFoo(SubClass<Foo> propertyFoo)

我知道这是一个微不足道的错误,但由于我已经花了所有这些时间来找到问题,也许它会帮助某人。如果mod / admin认为这没有帮助,我可以将其全部删除。