2012-08-24 32 views
6

Tôi đang cố gắng để serialize một proxy Java động sử dụng thư viện Jackson nhưng tôi nhận được lỗi này:Json serializing JDK động Proxy với thư viện 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; 
} 

tôi nhận được ngoại lệ này:

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

Các vấn đề có vẻ là giống nhau xảy ra khi các đối tượng được hỗ trợ hibernate được tuần tự hóa nhưng tôi không biết làm thế nào và nếu tôi có thể sử dụng mô-đun Jackson-hibernate để giải quyết vấn đề của tôi.

CẬP NHẬT: Các BUG đã được giải quyết từ Jackson 2.0.6 phát hành

+0

Câu hỏi nhanh về 'p' ở đây - loại đó là gì? (Hành tinh?). Ngoài ra, nên 'Planet' đang thực hiện' IPlanet': nếu có, lợi ích của Proxy là gì? – StaxMan

Trả lời

2

Bạn có thể thử Genson thư viện http://code.google.com/p/genson/. tôi chỉ kiểm tra mã của bạn với nó và nó hoạt động tốt đầu ra là { "tên": "foo"}

Planet p = new Planet(); 
p.setName("foo"); 
IPlanet ip = getProxy(IPlanet.class, p); 
Genson genson = new Genson(); 
System.out.println(genson.serialize(ip)); 

Nó có một vài tính năng tốt đẹp mà không exisit trong librairies khác. Chẳng hạn như sử dụng hàm tạo với các đối số không có chú thích hoặc áp dụng BeanView trên đối tượng của bạn trong thời gian chạy (hoạt động như mô hình của bạn), có thể deserialize thành các loại cụ thể và hơn thế nữa ... Hãy xem wiki http://code.google.com/p/genson/wiki/GettingStarted.

+0

Rất rất tốt, tôi rất ấn tượng bởi thư viện của bạn (vì có vẻ như bạn là nhà phát triển) !! Tôi đọc tài liệu và rất rõ ràng, tôi muốn nói rằng bạn đã thực hiện một công việc tốt, nhiều chú thích cũng tương tự như thư viện Jackson và trợ giúp này cho việc di chuyển cuối cùng. –

+0

Cảm ơn bạn rất nhiều, đó là một niềm vui thực sự mà bạn đánh giá cao công việc của tôi. – eugen

1

Nó có thể là một lỗi trong Jackson - lớp proxy có thể được ngăn chặn rõ ràng khỏi bị coi là đậu. Bạn có thể gửi một lỗi - nếu Genson có thể xử lý nó, Jackson cũng vậy. :-)

+0

Ok, cảm ơn bạn đã xác nhận rằng, tôi sẽ báo cáo sự cố –

+0

Sự cố đã được báo cáo về dự án Github Jackson-databind https://github.com/FasterXML/jackson-databind/issues/57 –

Các vấn đề liên quan