diff --git a/resteasy-client/src/main/java/org/jboss/resteasy/client/jaxrs/internal/proxy/extractors/BodyEntityExtractor.java b/resteasy-client/src/main/java/org/jboss/resteasy/client/jaxrs/internal/proxy/extractors/BodyEntityExtractor.java index 30504e4cbf4..84dd94ea646 100644 --- a/resteasy-client/src/main/java/org/jboss/resteasy/client/jaxrs/internal/proxy/extractors/BodyEntityExtractor.java +++ b/resteasy-client/src/main/java/org/jboss/resteasy/client/jaxrs/internal/proxy/extractors/BodyEntityExtractor.java @@ -6,12 +6,14 @@ import org.jboss.resteasy.client.jaxrs.i18n.Messages; import org.jboss.resteasy.client.jaxrs.internal.ClientInvocation; import org.jboss.resteasy.client.jaxrs.internal.ClientResponse; +import org.jboss.resteasy.spi.util.Types; import javax.ws.rs.core.GenericType; import java.io.InputStream; import java.io.Reader; import java.lang.reflect.Method; +import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; /** @@ -48,13 +50,13 @@ public Object extractEntity(ClientContext context, Object... args) { throw new RuntimeException(Messages.MESSAGES.noTypeInformation()); } + Type type = Types.resolveTypeVariables(context.getInvocation().getClientInvoker().getDeclaring(), + method.getGenericReturnType()); GenericType gt = null; - if (method.getGenericReturnType() != null && !(method.getGenericReturnType() instanceof TypeVariable)) - { - gt = new GenericType(method.getGenericReturnType()); - } - else - { + + if(!(type instanceof TypeVariable)) { + gt = new GenericType(type); + } else { gt = new GenericType(method.getReturnType()); } Object obj = ClientInvocation.extractResult(gt, response, method.getAnnotations()); diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/GenericProxyTest.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/GenericProxyTest.java index 3be7d571369..819cfc67cd2 100644 --- a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/GenericProxyTest.java +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/GenericProxyTest.java @@ -6,6 +6,12 @@ import org.jboss.resteasy.client.jaxrs.ResteasyClient; import javax.ws.rs.client.ClientBuilder; import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget; +import org.jboss.resteasy.test.client.proxy.resource.GenericEntities.EntityExtendingBaseEntity; +import org.jboss.resteasy.test.client.proxy.resource.GenericEntities.GenericEntityExtendingBaseEntityProxy; +import org.jboss.resteasy.test.client.proxy.resource.GenericEntities.GenericEntityExtendingBaseEntityResource; +import org.jboss.resteasy.test.client.proxy.resource.GenericEntities.MultipleGenericEntities; +import org.jboss.resteasy.test.client.proxy.resource.GenericEntities.MultipleGenericEntitiesProxy; +import org.jboss.resteasy.test.client.proxy.resource.GenericEntities.MultipleGenericEntitiesResource; import org.jboss.resteasy.test.client.proxy.resource.GenericProxyBase; import org.jboss.resteasy.test.client.proxy.resource.GenericProxySpecificProxy; import org.jboss.resteasy.test.client.proxy.resource.GenericProxyResource; @@ -22,6 +28,11 @@ import javax.ws.rs.client.Entity; import javax.ws.rs.core.Response; +import java.util.HashMap; +import java.util.List; + +import static org.jboss.resteasy.test.client.proxy.resource.GenericEntities.GenericEntityExtendingBaseEntityResource.FIRST_NAME; +import static org.jboss.resteasy.test.client.proxy.resource.GenericEntities.GenericEntityExtendingBaseEntityResource.LAST_NAME; /** * @tpSubChapter Resteasy-client @@ -48,7 +59,10 @@ public static void after() throws Exception { public static Archive deployUriInfoSimpleResource() { WebArchive war = TestUtil.prepareArchive(GenericProxyTest.class.getSimpleName()); war.addClasses(GenericProxyBase.class, GenericProxySpecificProxy.class); - return TestUtil.finishContainerPrepare(war, null, GenericProxyResource.class); + war.addPackage(MultipleGenericEntities.class.getPackage()); + return TestUtil.finishContainerPrepare(war, null, GenericProxyResource.class, + GenericEntityExtendingBaseEntityResource.class, + MultipleGenericEntitiesResource.class); } private static String generateBaseUrl() { @@ -84,4 +98,28 @@ public void testEchoNoProxy() { response.close(); } + + /** + * @tpTestDetails Test generic proxy in client extending another interface. Test for RESTEASY-1432. + * @tpSince RESTEasy 3.7.0 + */ + @Test + public void testInterfaceWithGenericTypeWithClientProxy() { + GenericEntityExtendingBaseEntityProxy proxy = client.target(generateBaseUrl()).proxy(GenericEntityExtendingBaseEntityProxy.class); + EntityExtendingBaseEntity entity; + + entity = proxy.findOne(); + Assert.assertEquals(entity.getLastName(), LAST_NAME); + + List entities = proxy.findAll(); + Assert.assertEquals(entities.get(0).getLastName(), LAST_NAME); + + + MultipleGenericEntitiesProxy proxy1 = client.target(generateBaseUrl()).proxy(MultipleGenericEntitiesProxy.class); + + HashMap hashMap = proxy1.findHashMap(); + entity = hashMap.get(FIRST_NAME); + Assert.assertEquals(entity.getLastName(), LAST_NAME); + } + } diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/BaseEntity.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/BaseEntity.java new file mode 100644 index 00000000000..6688421848e --- /dev/null +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/BaseEntity.java @@ -0,0 +1,13 @@ +package org.jboss.resteasy.test.client.proxy.resource.GenericEntities; + +public class BaseEntity { + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/EntityExtendingBaseEntity.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/EntityExtendingBaseEntity.java new file mode 100644 index 00000000000..0ff2f5f6274 --- /dev/null +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/EntityExtendingBaseEntity.java @@ -0,0 +1,20 @@ +package org.jboss.resteasy.test.client.proxy.resource.GenericEntities; + +public class EntityExtendingBaseEntity extends BaseEntity { + private String lastName; + + public EntityExtendingBaseEntity() {} + + public EntityExtendingBaseEntity(final String name, final String lastName) { + super.setName(name); + this.lastName = lastName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } +} diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/GenericEntityExtendingBaseEntity.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/GenericEntityExtendingBaseEntity.java new file mode 100644 index 00000000000..d66090ede31 --- /dev/null +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/GenericEntityExtendingBaseEntity.java @@ -0,0 +1,22 @@ +package org.jboss.resteasy.test.client.proxy.resource.GenericEntities; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import java.util.List; + +@Path("/") +public interface GenericEntityExtendingBaseEntity { + + @GET + @Path("one") + @Produces(MediaType.APPLICATION_JSON) + T findOne(); + + @GET + @Path("all") + @Produces(MediaType.APPLICATION_JSON) + List findAll(); + +} diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/GenericEntityExtendingBaseEntityProxy.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/GenericEntityExtendingBaseEntityProxy.java new file mode 100644 index 00000000000..d50f943e75d --- /dev/null +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/GenericEntityExtendingBaseEntityProxy.java @@ -0,0 +1,6 @@ +package org.jboss.resteasy.test.client.proxy.resource.GenericEntities; + +public interface GenericEntityExtendingBaseEntityProxy extends GenericEntityExtendingBaseEntity { + +} + diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/GenericEntityExtendingBaseEntityResource.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/GenericEntityExtendingBaseEntityResource.java new file mode 100644 index 00000000000..82721ba2149 --- /dev/null +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/GenericEntityExtendingBaseEntityResource.java @@ -0,0 +1,28 @@ +package org.jboss.resteasy.test.client.proxy.resource.GenericEntities; + +import java.util.ArrayList; +import java.util.List; + +public class GenericEntityExtendingBaseEntityResource implements GenericEntityExtendingBaseEntity { + public static final String FIRST_NAME = "FirstName"; + public static final String LAST_NAME = "LastName"; + + public static List generateEntities(int count) { + List entityExtendingBaseEntities = new ArrayList<>(); + for(int i = 0; i < count; i++) { + entityExtendingBaseEntities.add(new EntityExtendingBaseEntity(FIRST_NAME, LAST_NAME)); + } + return entityExtendingBaseEntities; + } + + @Override + public List findAll() { + return generateEntities(2); + } + + @Override + public EntityExtendingBaseEntity findOne() { + return new EntityExtendingBaseEntity(FIRST_NAME, LAST_NAME); + } + +} diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/MultipleGenericEntities.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/MultipleGenericEntities.java new file mode 100644 index 00000000000..a454a20b9f8 --- /dev/null +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/MultipleGenericEntities.java @@ -0,0 +1,17 @@ +package org.jboss.resteasy.test.client.proxy.resource.GenericEntities; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import java.util.HashMap; + +@Path("") +public interface MultipleGenericEntities { + + @GET + @Path("hashMap") + @Produces(MediaType.APPLICATION_JSON) + HashMap findHashMap(); + +} diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/MultipleGenericEntitiesProxy.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/MultipleGenericEntitiesProxy.java new file mode 100644 index 00000000000..630abc50782 --- /dev/null +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/MultipleGenericEntitiesProxy.java @@ -0,0 +1,5 @@ +package org.jboss.resteasy.test.client.proxy.resource.GenericEntities; + +public interface MultipleGenericEntitiesProxy extends MultipleGenericEntities { + +} diff --git a/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/MultipleGenericEntitiesResource.java b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/MultipleGenericEntitiesResource.java new file mode 100644 index 00000000000..ca40dc44e8a --- /dev/null +++ b/testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/client/proxy/resource/GenericEntities/MultipleGenericEntitiesResource.java @@ -0,0 +1,16 @@ +package org.jboss.resteasy.test.client.proxy.resource.GenericEntities; + +import java.util.HashMap; + +import static org.jboss.resteasy.test.client.proxy.resource.GenericEntities.GenericEntityExtendingBaseEntityResource.FIRST_NAME; +import static org.jboss.resteasy.test.client.proxy.resource.GenericEntities.GenericEntityExtendingBaseEntityResource.LAST_NAME; + +public class MultipleGenericEntitiesResource implements MultipleGenericEntities { + + @Override + public HashMap findHashMap() { + HashMap res = new HashMap<>(); + res.put(FIRST_NAME, new EntityExtendingBaseEntity(FIRST_NAME, LAST_NAME)); + return res; + } +}