Fix [Issue#57] for 1.9.10
diff --git a/release-notes/VERSION b/release-notes/VERSION
index 7a7a648..0e1de69 100644
--- a/release-notes/VERSION
+++ b/release-notes/VERSION
@@ -7,7 +7,8 @@
Another patch release for 1.9.
Fixes:
- * [JACKSON-855] add StackOverflowError as root cause
+ * [JACKSON-855]: add StackOverflowError as root cause
+ * [Issue#57]: Allow serialization of JDK proxy types
------------------------------------------------------------------------
=== History: ===
diff --git a/src/mapper/java/org/codehaus/jackson/map/util/ClassUtil.java b/src/mapper/java/org/codehaus/jackson/map/util/ClassUtil.java
index 7b04299..b2ac0ab 100644
--- a/src/mapper/java/org/codehaus/jackson/map/util/ClassUtil.java
+++ b/src/mapper/java/org/codehaus/jackson/map/util/ClassUtil.java
@@ -150,10 +150,12 @@
*/
public static boolean isProxyType(Class<?> type)
{
- // Then: well-known proxy (etc) classes
+ // As per [Issue#57], should NOT disqualify JDK proxy:
+ /*
if (Proxy.isProxyClass(type)) {
return true;
}
+ */
String name = type.getName();
// Hibernate uses proxies heavily as well:
if (name.startsWith("net.sf.cglib.proxy.")
diff --git a/src/test/org/codehaus/jackson/map/interop/TestJDKProxy.java b/src/test/org/codehaus/jackson/map/interop/TestJDKProxy.java
new file mode 100644
index 0000000..ffec85f
--- /dev/null
+++ b/src/test/org/codehaus/jackson/map/interop/TestJDKProxy.java
@@ -0,0 +1,70 @@
+package org.codehaus.jackson.map.interop;
+
+import java.lang.reflect.*;
+
+import org.codehaus.jackson.map.*;
+
+// mostly for [Issue#57]
+public class TestJDKProxy extends BaseMapTest
+{
+ final ObjectMapper MAPPER = new ObjectMapper();
+
+ public interface IPlanet {
+ String getName();
+ String setName(String s);
+ }
+
+ // bit silly example; usually wouldn't implement interface (no need to proxy if it did)
+ static class Planet implements IPlanet {
+ private String name;
+
+ public Planet() { }
+ public Planet(String s) { name = s; }
+
+ public String getName(){return name;}
+ public String setName(String iName) {name = iName;
+ return name;
+ }
+ }
+
+ /*
+ /********************************************************
+ /* Test methods
+ /********************************************************
+ */
+
+ public void testSimple() throws Exception
+ {
+ IPlanet input = getProxy(IPlanet.class, new Planet("Foo"));
+ String json = MAPPER.writeValueAsString(input);
+ assertEquals("{\"name\":\"Foo\"}", json);
+
+ // and just for good measure
+ Planet output = MAPPER.readValue(json, Planet.class);
+ assertEquals("Foo", output.getName());
+ }
+
+ /*
+ /********************************************************
+ /* Helper methods
+ /********************************************************
+ */
+
+ public static <T> T getProxy(Class<T> type, Object toProxy) {
+ class ProxyUtil implements InvocationHandler {
+ Object obj;
+ public ProxyUtil(Object o) {
+ obj = o;
+ }
+ public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
+ Object result = null;
+ result = m.invoke(obj, args);
+ return result;
+ }
+ }
+ @SuppressWarnings("unchecked")
+ T proxy = (T) Proxy.newProxyInstance(type.getClassLoader(), new Class[] { type },
+ new ProxyUtil(toProxy));
+ return proxy;
+ }
+}