package org.jboss.resteasy.test.providers.jackson2.resource; import org.jboss.logging.Logger; import javax.ws.rs.Path; import javax.ws.rs.Produces; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; @Path("/") public class ProxyWithGenericReturnTypeJacksonResource { protected static final Logger logger = Logger.getLogger(ProxyWithGenericReturnTypeJacksonResource.class.getName()); @Produces("text/plain") @Path("test") public ProxyWithGenericReturnTypeJacksonSubResourceSubIntf resourceLocator() { Object proxy = Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{ProxyWithGenericReturnTypeJacksonSubResourceSubIntf.class}, new TestInvocationHandler()); return ProxyWithGenericReturnTypeJacksonSubResourceSubIntf.class.cast(proxy); } static class TestInvocationHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { logger.info("entered proxied subresource"); logger.info("method: " + method.getName()); logger.info("generic return type: " + method.getGenericReturnType()); logger.info("type of return type: " + method.getGenericReturnType().getClass()); if ("resourceMethod".equals(method.getName())) { List<ProxyWithGenericReturnTypeJacksonAbstractParent> l = new ArrayList<ProxyWithGenericReturnTypeJacksonAbstractParent>(); ProxyWithGenericReturnTypeJacksonType1 first = new ProxyWithGenericReturnTypeJacksonType1(); first.setId(1); first.setName("MyName"); l.add(first); ProxyWithGenericReturnTypeJacksonType2 second = new ProxyWithGenericReturnTypeJacksonType2(); second.setId(2); second.setNote("MyNote"); l.add(second); return l; } if ("resourceMethodOne".equals(method.getName())) { ProxyWithGenericReturnTypeJacksonType1 first = new ProxyWithGenericReturnTypeJacksonType1(); first.setId(1); first.setName("MyName"); return first; } return null; } } }