2012-08-24 15 views
6

Ich versuche, eine Java Dynamische Proxy Jackson Bibliothek serialisiert, aber ich bekomme diese Fehlermeldung:Json Serialisieren JDK Dynamische Proxy mit Jackson Bibliothek

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

Ich erhalte diese Ausnahme:

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

Die Problem scheint das gleiche zu sein, das passiert, wenn Hibernate Proxy-Objekte serialisiert werden, aber ich weiß nicht, wie und ob ich das Jackson-Hibernate-Modul verwenden kann, um mein Problem zu lösen.

UPDATE: Die BUG von Jackson wurde gelöst Release 2.0.6

+0

Schnelle Frage zu 'p' hier - welcher Typ ist es? (Planet?). Sollte "Planet" auch 'IPlanet' implementieren: Wenn ja, welchen Nutzen hat Proxy? – StaxMan

Antwort

2

Sie Bibliothek Genson versuchen können http://code.google.com/p/genson/. Getestet habe ich nur den Code mit ihm und es funktioniert gut die Ausgabe { „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)); 

Es hat ein paar nette Features, die in anderen librairies nicht exisit. Wie Konstruktor mit Argumenten ohne Annotation zu verwenden oder BeanView auf Ihre Objekte zur Laufzeit anzuwenden (fungiert als eine Ansicht Ihres Modells), kann zu konkreten Typen deserialisieren, und mehr ... Werfen Sie einen Blick auf das Wiki http://code.google.com/p/genson/wiki/GettingStarted.

+0

Sehr, sehr gut, ich bin sehr beeindruckt von Ihrer Bibliothek (seit scheint, dass Sie der Entwickler sind) !! Ich lese die Dokumentation und bin sehr klar, ich möchte sagen, dass du einen guten Job gemacht hast, viele Anmerkungen sind auch der Jackson-Bibliothek und dieser Hilfe für eine eventuelle Migration ähnlich. –

+0

Vielen Dank, es ist ein echtes Vergnügen, dass Sie meine Arbeit zu schätzen wissen. – eugen

1

Es könnte ein Fehler in Jackson sein - es kann explizit verhindert werden, dass proxisierte Klassen als Beans betrachtet werden. Du könntest einen Fehler melden - wenn Genson damit klarkommt, sollte Jackson das auch tun. :-)

+0

Ok, danke für die Bestätigung, ich werde das Problem melden –

+0

Gemeldete Ausgabe auf Jackson-Databind Github Projekt https://github.com/FasterXML/jackson-databind/issues/57 –