2012-08-24 9 views
6

मैं जैक्सन लाइब्रेरी का उपयोग कर एक जावा गतिशील प्रॉक्सी क्रमानुसार करने की कोशिश कर रहा हूँ, लेकिन मैं इस त्रुटि मिलती है:Json serializing JDK गतिशील प्रॉक्सी

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

:

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

मैं इस अपवाद समस्या वही होती है जो तब होती है जब हाइबरनेट प्रॉक्सीकृत ऑब्जेक्ट्स को क्रमबद्ध किया जाता है लेकिन मुझे नहीं पता कि मैं अपने मुद्दे को हल करने के लिए जैक्सन-हाइबरनेट-मॉड्यूल का उपयोग कैसे कर सकता हूं।

अद्यतन: बग जैक्सन से हल किया गया था जारी

+0

यहां 'पी' पर त्वरित प्रश्न - यह किस प्रकार का है? (ग्रह?)। साथ ही, 'ग्रह' को 'आईप्लानेट' लागू करना चाहिए: यदि यह है, तो प्रॉक्सी का क्या फायदा है? – StaxMan

उत्तर

2

आप Genson पुस्तकालय http://code.google.com/p/genson/ कोशिश कर सकते हैं 2.0.6। मैं सिर्फ इसके साथ अपने कोड का परीक्षण किया और यह ठीक काम करता है उत्पादन { "नाम": "foo"} है

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

यह है कि अन्य librairies में exisit नहीं है अच्छा सुविधाओं की एक जोड़ी है। किसी भी एनोटेशन के बिना तर्क के साथ कन्स्ट्रक्टर का उपयोग करने या रनटाइम पर आपकी ऑब्जेक्ट्स पर बीन व्यू कहलाता है (कंक्रीट प्रकारों के रूप में कार्य करता है) और अधिक ... विकी http://code.google.com/p/genson/wiki/GettingStarted पर एक नज़र डालें।

+0

बहुत अच्छा, मैं आपकी लाइब्रेरी से बहुत प्रभावित हूं (ऐसा लगता है कि आप डेवलपर हैं) !! मैंने प्रलेखन पढ़ा और यह बहुत स्पष्ट है, मैं कहना चाहता हूं कि आपने एक अच्छी नौकरी की है, कई एनोटेशन जैक्सन लाइब्रेरी के समान हैं और अंततः माइग्रेशन के लिए यह सहायता है। –

+0

आपको बहुत बहुत धन्यवाद, यह एक वास्तविक खुशी है कि आप मेरे काम की सराहना करते हैं। – eugen

1

यह जैक्सन में एक बग हो सकता है - प्रॉक्सी कक्षाओं को स्पष्ट रूप से बीन्स माना जाने से रोका जा सकता है। आप एक बग फाइल कर सकते हैं - यदि जेन्सन इसे संभाल सकता है, तो जैक्सन भी चाहिए। :-)

+0

ठीक है, पुष्टि करने के लिए धन्यवाद, मैं –

+0

समस्या की रिपोर्ट करूंगा जैक्सन-डाटाबेस गिथब परियोजना पर रिपोर्ट की गई समस्या https://github.com/FasterXML/jackson-databind/issues/57 –

संबंधित मुद्दे