Jackson ObjectMapper 仅接口已知
Jackson ObjectMapper only interfaces known
如果我想将一些 JSON 读入对象,并且我有接口但必须使用 Spring 上下文来获取实现 class,我需要使用SimpleAbstractTypeResolver 将接口映射到实现。到目前为止,一切顺利,如果我提前知道什么接口去什么实现。但是,如果该接口具有 return 其他接口的方法——并且可能递归地沿线向下——而且我不一定事先知道,我想我可以使用反射来解决它。所以这就是我想出的,但是编译器不喜欢行 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);
}
}
}
可能您需要检查您的类型。
我的猜测如下:
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);
如果我想将一些 JSON 读入对象,并且我有接口但必须使用 Spring 上下文来获取实现 class,我需要使用SimpleAbstractTypeResolver 将接口映射到实现。到目前为止,一切顺利,如果我提前知道什么接口去什么实现。但是,如果该接口具有 return 其他接口的方法——并且可能递归地沿线向下——而且我不一定事先知道,我想我可以使用反射来解决它。所以这就是我想出的,但是编译器不喜欢行 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);
}
}
}
可能您需要检查您的类型。
我的猜测如下:
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);