spring JacksonObjectMapper仅限已知接口

ltskdhd1  于 2022-12-17  发布在  Spring
关注(0)|答案(2)|浏览(92)

如果我想把一些JSON读入一个对象,并且我有接口,但必须使用Spring上下文来获得实现类,我需要使用SimpleAbstractTypeResolver来将接口Map到实现。如果我事先知道什么接口去什么实现。但是如果接口有返回其他接口的方法--可能是递归的--而我不知道我不需要事先知道,我想我可以使用反射来解决它。这就是我想到的,但是编译器不喜欢resolver.addMapping(method.getReturnType(),method.getReturnType())这行;,表示它不适用于这些参数,我非常肯定这些类型对那个方法来说是可以的--有什么想法吗?

for (Method method : clazz.getMethods()) {
        if (method.getReturnType().isInterface() && method.getName().startsWith("get")) {
            // getter method returns an interface so find its implementation class
            Class beanClass = context.getBean(method.getReturnType()).getClass();
            if (clazz.isAssignableFrom(beanClass)) {
                resolver.addMapping(method.getReturnType(), method.getReturnType());
                mapInterfaces(objectMapper, clazz, resolver);
            }
        }
    }
euoag5mw

euoag5mw1#

也许你需要检查一下你的类型。
我的猜测如下:

resolver.addMapping(method.getReturnType(), beanClass);

(将第二个参数方法.getReturnType()替换为beanClass)
或者作为替代(代码对我来说不是完全清楚,抱歉)

resolver.addMapping(clazz, beanClass);

您应该将接口和实现放入addMapping()中。
示例:

interface ITest{};

class TestImpl implements ITest {}

usage:
resolver.addMapping(ITest.class, TestImpl.class);
eh57zj3b

eh57zj3b2#

也许你需要检查一下你的类型。
我的猜测如下:

new ObjectMapper().writerFor(<Interface>.class).writeValuesAsArray(<Class>);

相关问题