Json Serializing JDK Dynamic Proxy with Jackson Library

I am trying to serialize a Java Dynamic proxy using the Jackson library, but I am getting this error:

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; } 

I get this exception:

 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) ) 

The problem seems the same as when merging proxied objects with hibernation, but I don’t know how and if I can use the Jackson-hibernate module to solve my problem.

UPDATE : BUG was resolved from Jackson 2.0.6 release

+6
source share
2 answers

You can try the Genson library http://code.google.com/p/genson/ . I just checked your code with it and it works great, output: {"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)); 

It has some nice features that do not exist in other librairies. For example, using a constructor with arguments without any annotation or applying what is called a BeanView on your objects at runtime (acts as a representation of your model) can deserialize to specific types and much more ... Take a look at the wiki http: // code.google.com/p/genson/wiki/GettingStarted .

+2
source

This may be a mistake in Jackson - proxied classes may be explicitly forbidden to consider beans. You can make a mistake - if Genson handles this, Jackson should also. :-)

+1
source

Source: https://habr.com/ru/post/923683/


All Articles