2012-08-24 11 views
6

Próbuję serializacji proxy Java z wykorzystaniem biblioteki dynamicznej Jackson, ale pojawia się ten błąd:Json szeregowania JDK Dynamiczny Proxy z biblioteką Jackson

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

otrzymuję ten wyjątek:

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

problem wydaje się być taki sam, jak dzieje się, gdy obiekty proxy w trybie hibernacji są serializowane, ale nie wiem jak i czy mogę użyć modułu hibernacji Jackson do rozwiązania mojego problemu.

UPDATE: błąd został rozwiązany z Jackson 2.0.6 zwolnić

+0

Szybkie pytanie na temat "p" tutaj - jaki to typ? (Planeta?). Poza tym, czy 'Planeta' powinna implementować' IPlanet': jeśli tak, to jaka jest korzyść z Proxy? – StaxMan

Odpowiedz

2

Można spróbować Genson bibliotekę http://code.google.com/p/genson/. Właśnie przetestowany kod z nim i to działa dobrze wyjście jest { „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)); 

To ma kilka ciekawych funkcji, które nie exisit w innych librairies. Takich jak użycie konstruktora z argumentami bez adnotacji lub zastosowanie tego, co nazywa się BeanView na obiektach w czasie wykonywania (działa jak widok modelu), może deserializować do konkretnych typów i nie tylko ... Zobacz wiki: http://code.google.com/p/genson/wiki/GettingStarted.

+0

Bardzo, bardzo dobrze, jestem pod wrażeniem twojej biblioteki (ponieważ wydaje się, że jesteś programistą) !! Przeczytałem dokumentację i jest bardzo jasne, chcę powiedzieć, że wykonałeś dobrą robotę, wiele adnotacji jest podobnych do biblioteki Jacksona i ta pomoc dla ewentualnej migracji. –

+0

Dziękuję bardzo, to prawdziwa przyjemność, że doceniasz moją pracę. – eugen

1

Może to być błąd w Jackson - prymitywne klasy mogą być wyraźnie zabronione uważane za fasolę. Możesz zgłosić błąd - jeśli Genson poradzi sobie z tym, Jackson też powinien. :-)

+0

OK, dziękuję za potwierdzenie, że zgłoszę problem –

+0

Zgłoszony problem w projekcie Jackson-databind Github https://github.com/FasterXML/jackson-databind/issues/57 –