6

Jacksonライブラリを使用してJavaDynamicプロキシをシリアル化しようとしていますが、次のエラーが発生します。

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

この例外が発生します:

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

問題は、Hibernateプロキシオブジェクトがシリアル化されたときに発生する問題と同じように見えますが、Jackson-hibernate-moduleを使用して問題を解決する方法と方法がわかりません。

更新:バグはJackson2.0.6リリースから解決されました

4

2 に答える 2

2

Gensonライブラリhttp://code.google.com/p/genson/を試すことができます。私はあなたのコードをそれでテストしました、そしてそれはうまくいきます出力は{"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));

他の書店にはない素晴らしい機能がいくつかあります。アノテーションなしで引数を指定してコンストラクターを使用したり、実行時にオブジェクトにBeanViewと呼ばれるものを適用したり(モデルのビューとして機能)、具象型に逆シリアル化できます... wiki http:/をご覧ください/code.google.com/p/genson/wiki/GettingStarted

于 2012-08-24T16:19:29.047 に答える
1

これはJacksonのバグである可能性があります。プロキシされたクラスは明示的にBeanと見なされない可能性があります。バグを報告することができます-Gensonがそれを処理できるのであれば、Jacksonもそうすべきです。:-)

于 2012-08-24T18:57:39.557 に答える