我正在尝试使用Jackson库序列化Java Dynamic代理,但是我收到了这个错误:
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;
}
我得到了这个例外:
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) )
问题似乎与hibernate代理对象序列化时发生的情况相同,但我不知道如何使用Jackson-hibernate模块来解决我的问题。
更新: BUG是从Jackson 2.0.6发布的
解决的答案 0 :(得分:2)
您可以尝试Genson库http://code.google.com/p/genson/。 我刚用它测试了你的代码,它的工作正常,输出是{“name”:“foo”}
Planet p = new Planet();
p.setName("foo");
IPlanet ip = getProxy(IPlanet.class, p);
Genson genson = new Genson();
System.out.println(genson.serialize(ip));
它有一些很好的功能,在其他图书馆中不存在。 比如在没有任何注释的情况下使用带有参数的构造函数,或者在运行时在对象上应用所谓的BeanView(作为模型的视图),可以反序列化为具体类型,等等......看看wiki {{3 }}
答案 1 :(得分:1)
它可能是杰克逊的一个错误 - 代理类可能被明确阻止被视为bean。你可以提出一个错误 - 如果Genson可以处理它,杰克逊也应该。 : - )