为了账号安全,请及时绑定邮箱和手机立即绑定

Jackson ObjectMapper 仅接口已知

Jackson ObjectMapper 仅接口已知

呼如林 2023-06-21 16:14:30
如果我想将一些 JSON 读入一个对象,并且我有接口,但必须使用 Spring 上下文来获取实现类,我需要使用 SimpleAbstractTypeResolver 将接口映射到实现。到目前为止,如果我提前知道哪些接口需要哪些实现,那就太好了。但是,如果该接口具有返回其他接口的方法(并且可能递归地向下行),并且我不一定提前知道,我想我可以使用反射来弄清楚。所以这就是我想出的,但编译器不喜欢该行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);            }        }    }
查看完整描述

2 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

可能您需要检查您的类型。


我的猜测如下:


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

(将第二个参数method.getReturnType()替换为beanClass)


或者作为替代方案(代码对我来说并不完全清楚,抱歉)


resolver.addMapping(clazz, beanClass);

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


例子:


interface ITest{};


class TestImpl implements ITest {}


usage:

resolver.addMapping(ITest.class, TestImpl.class);


查看完整回答
反对 回复 2023-06-21
?
白板的微信

TA贡献1883条经验 获得超3个赞

可能您需要检查您的类型。

我的猜测如下:

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


查看完整回答
反对 回复 2023-06-21
  • 2 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信