Java Json使用Jackson库序列化JDK动态代理

Java Json使用Jackson库序列化JDK动态代理,java,json,jackson,dynamic-proxy,Java,Json,Jackson,Dynamic Proxy,我试图使用Jackson库序列化Java动态代理,但出现以下错误: public interface IPlanet { String getName(); } Planet implements IPlanet { private String name; public String getName(){return name;} public String setName(String iName){name = iName;} } IPlanet ip = Ob

我试图使用Jackson库序列化Java动态代理,但出现以下错误:

public interface IPlanet {
String getName();
}

Planet implements IPlanet {
    private String name;
    public String getName(){return name;}
    public String setName(String iName){name = iName;}
}

IPlanet ip = ObjectsUtil.getProxy(IPlanet.class, p);
ObjectMapper mapper = new ObjectMapper();
mapper.writeValueAsString(ip);

//The proxy generation utility is implemented in this way:
/**
 * Create new proxy object that give the access only to the method of the specified
 * interface.
 * 
 * @param type
 * @param obj
 * @return
 */
public static <T> T getProxy(Class<T> type, Object obj) {
    class ProxyUtil implements InvocationHandler {
        Object obj;
        public ProxyUtil(Object o) {
            obj = o;
        }
        @Override
        public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
            Object result = null;
            result = m.invoke(obj, args);
            return result;
        }
    }
    // TODO: The suppress warning is needed cause JDK class java.lang.reflect.Proxy
    // needs generics
    @SuppressWarnings("unchecked")
    T proxy = (T) Proxy.newProxyInstance(type.getClassLoader(), new Class[] { type },
            new ProxyUtil(obj));
    return proxy;
}
问题似乎与序列化hibernate代理对象时发生的问题相同,但我不知道如何以及是否可以使用Jackson hibernate模块来解决我的问题

更新
该漏洞已从Jackson 2.0.6版本中解决

您可以尝试Genson库。 我刚刚用它测试了您的代码,它运行良好。输出为{“name”:“foo”}

它有一些其他图书馆没有的好功能。
例如,在不带任何注释的情况下使用带参数的构造函数,或者在运行时在对象上应用所谓的BeanView(充当模型的视图),可以反序列化为具体类型,等等。。。看看wiki。

这可能是Jackson中的一个bug——代理类可能会被明确禁止被视为bean。您可以提交一个bug——如果Genson能够处理它,Jackson也应该提交。:-)

非常非常好,我对您的库印象很好(因为您似乎是开发人员)!!我阅读了文档,非常清楚,我想说你做得很好,许多注释也类似于Jackson library,这有助于最终的迁移。非常感谢你,非常高兴你能欣赏我的工作。Jackson databind Github项目的报告问题这里是关于“p”的快速问题——它是什么类型的?(地球?)。另外,是否应该实施
Planet
:如果是,代理的好处是什么?
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class $Proxy11 and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) )
Planet p = new Planet();
p.setName("foo");
IPlanet ip = getProxy(IPlanet.class, p);
Genson genson = new Genson();
System.out.println(genson.serialize(ip));