You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2013/08/14 16:40:15 UTC

svn commit: r1513900 - in /cxf/branches/2.6.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ rt/fronte...

Author: sergeyb
Date: Wed Aug 14 14:40:15 2013
New Revision: 1513900

URL: http://svn.apache.org/r1513900
Log:
Merged revisions 1513886 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/branches/2.7.x-fixes

................
  r1513886 | sergeyb | 2013-08-14 16:59:16 +0300 (Wed, 14 Aug 2013) | 9 lines
  
  Merged revisions 1513867 via svnmerge from 
  https://svn.apache.org/repos/asf/cxf/trunk
  
  ........
    r1513867 | sergeyb | 2013-08-14 16:16:58 +0300 (Wed, 14 Aug 2013) | 1 line
    
    [CXF-5204] Better support for TypeVariable in JAX-RS frontend
  ........
................

Added:
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/AbstractRestController.java
      - copied unchanged from r1513886, cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/AbstractRestController.java
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/ConcreteRestController.java
      - copied unchanged from r1513886, cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/ConcreteRestController.java
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/ConcreteRestResource.java
      - copied unchanged from r1513886, cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/ConcreteRestResource.java
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/RestResource.java
      - copied unchanged from r1513886, cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/fortest/RestResource.java
    cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/AbstractGenericBookStoreSpring.java
      - copied unchanged from r1513886, cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/AbstractGenericBookStoreSpring.java
    cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/GenericBookStoreSpring.java
      - copied unchanged from r1513886, cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/GenericBookStoreSpring.java
    cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/SuperBookInterface.java
      - copied unchanged from r1513886, cxf/branches/2.7.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/SuperBookInterface.java
Modified:
    cxf/branches/2.6.x-fixes/   (props changed)
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/SelectMethodCandidatesTest.java
    cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java
    cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java
    cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java
    cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java
    cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/SuperBook.java
    cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml

Propchange: cxf/branches/2.6.x-fixes/
------------------------------------------------------------------------------
  Merged /cxf/branches/2.7.x-fixes:r1513886
  Merged /cxf/trunk:r1513867

Propchange: cxf/branches/2.6.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java?rev=1513900&r1=1513899&r2=1513900&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java Wed Aug 14 14:40:15 2013
@@ -538,7 +538,7 @@ public class ClientProxyImpl extends Abs
         
         Object response = null;
         try {
-            response = handleResponse(outMessage);
+            response = handleResponse(outMessage, ori.getClassResourceInfo().getServiceClass());
             return response;
         } catch (Exception ex) {
             response = ex;
@@ -564,7 +564,7 @@ public class ClientProxyImpl extends Abs
                                    body, bodyIndex, exchange, invContext);
     }
     
-    protected Object handleResponse(Message outMessage) 
+    protected Object handleResponse(Message outMessage, Class<?> serviceCls) 
         throws Throwable {
         try {
             Response r = setResponseBuilder(outMessage, outMessage.getExchange()).build();
@@ -578,14 +578,15 @@ public class ClientProxyImpl extends Abs
                     && ((InputStream)r.getEntity()).available() == 0)) {
                 return r;
             }
-
+            Class<?> returnType = method.getReturnType(); 
             Type genericType = 
-                InjectionUtils.processGenericTypeIfNeeded(method.getDeclaringClass(), 
+                InjectionUtils.processGenericTypeIfNeeded(serviceCls,
+                                                          returnType,   
                                                           method.getGenericReturnType());
-            
+            returnType = InjectionUtils.updateParamClassToTypeIfNeeded(returnType, genericType);
             return readBody(r, 
                             outMessage, 
-                            method.getReturnType(), 
+                            returnType, 
                             genericType, 
                             method.getDeclaredAnnotations());
         } finally {
@@ -641,11 +642,10 @@ public class ClientProxyImpl extends Abs
             Object body = objs.get(0);
             try {
                 if (bodyIndex != -1) {
-                    Type paramType = method.getGenericParameterTypes()[bodyIndex];
-                    paramType = InjectionUtils.processGenericTypeIfNeeded(method.getDeclaringClass(),
-                                                                          paramType);                      
-                    writeBody(body, outMessage, body.getClass(), paramType,
-                              anns, headers, os);
+                    Type genericType = method.getGenericParameterTypes()[bodyIndex];
+                    genericType = InjectionUtils.processGenericTypeIfNeeded(
+                        ori.getClassResourceInfo().getServiceClass(), body.getClass(), genericType);
+                    writeBody(body, outMessage, body.getClass(), genericType, anns, headers, os);
                 } else {
                     writeBody(body, outMessage, body.getClass(), body.getClass(), 
                               anns, headers, os);

Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java?rev=1513900&r1=1513899&r2=1513900&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/interceptor/JAXRSOutInterceptor.java Wed Aug 14 14:40:15 2013
@@ -201,6 +201,7 @@ public class JAXRSOutInterceptor extends
         
         List<MediaType> availableContentTypes = computeAvailableContentTypes(message, response);  
         
+
         Method invoked = null;
         if (firstTry) {
             invoked = ori == null ? null : ori.getAnnotatedMethod() == null
@@ -210,7 +211,7 @@ public class JAXRSOutInterceptor extends
         Type genericType = getGenericResponseType(invoked, responseObj, targetType);
         if (ori != null) {
             genericType = InjectionUtils.processGenericTypeIfNeeded(
-                ori.getClassResourceInfo().getServiceClass(), genericType);
+                ori.getClassResourceInfo().getServiceClass(), targetType, genericType);
         }
                
         Annotation[] annotations = invoked != null ? invoked.getAnnotations() : new Annotation[]{};

Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=1513900&r1=1513899&r2=1513900&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Wed Aug 14 14:40:15 2013
@@ -122,12 +122,6 @@ public final class InjectionUtils {
             }
         }
         
-        Type[] bounds = var.getBounds();
-        int boundPos = bounds.length > pos ? pos : 0; 
-        if (bounds.length > boundPos && bounds[boundPos] != Object.class) {
-            return bounds[boundPos];
-        }
-                
         Type genericSubtype = serviceClass.getGenericSuperclass();
         if (genericSubtype == Object.class) {
             Type[] genInterfaces = serviceClass.getGenericInterfaces();
@@ -138,7 +132,14 @@ public final class InjectionUtils {
         }
         Type result = genericSubtype != Object.class ? InjectionUtils.getActualType(genericSubtype, pos)
                                               : genericSubtype;
-        return result == null ? Object.class : result;
+        if (result == null || result == Object.class) {
+            Type[] bounds = var.getBounds();
+            int boundPos = bounds.length > pos ? pos : 0; 
+            if (bounds.length > boundPos && bounds[boundPos] != Object.class) {
+                result = bounds[boundPos];
+            }
+        }
+        return result;
     }
     
     public static Method checkProxy(Method methodToInvoke, Object resourceObject) {
@@ -215,13 +216,18 @@ public final class InjectionUtils {
             } else if (genericType instanceof GenericArrayType) {
                 genericType = ((GenericArrayType)genericType).getGenericComponentType();
             }
-
-            Class<?> cls = (Class<?>)genericType;
+            Class<?> cls = null;
+            if (!(genericType instanceof ParameterizedType)) {
+                cls = (Class<?>)genericType;
+            } else {
+                cls = (Class<?>)((ParameterizedType)genericType).getRawType();
+            }
             return cls.isArray() ? cls.getComponentType() : cls;
+            
         }
         ParameterizedType paramType = (ParameterizedType)genericType;
         Type t = getType(paramType.getActualTypeArguments(), pos);
-        return t instanceof Class ? (Class<?>)t : getActualType(t, pos);
+        return t instanceof Class ? (Class<?>)t : getActualType(t, 0);
     }
     
     public static Type getType(Type[] types, int pos) {
@@ -1175,16 +1181,33 @@ public final class InjectionUtils {
         }
     }
     
-    public static Type processGenericTypeIfNeeded(Class<?> cls, Type type) {
+
+    public static Class<?> updateParamClassToTypeIfNeeded(Class<?> paramCls, Type type) {
+        if (type instanceof Class && paramCls.isAssignableFrom((Class<?>)type)) {
+            paramCls = (Class<?>)type; 
+        }
+        return paramCls;
+    }
+    
+
+    public static Type processGenericTypeIfNeeded(Class<?> serviceCls, Class<?> paramCls, Type type) {
+       
         if (type instanceof TypeVariable) {
-            return InjectionUtils.getSuperType(cls, (TypeVariable<?>)type);
+            type = InjectionUtils.getSuperType(serviceCls, (TypeVariable<?>)type);
         } else if (type instanceof ParameterizedType
             && ((ParameterizedType)type).getActualTypeArguments()[0] instanceof TypeVariable
             && isSupportedCollectionOrArray(getRawType(type))) {
-            return new ParameterizedCollectionType(InjectionUtils.getActualType(type, 0));
-        } else {
-            return type;
+            TypeVariable<?> typeVar = (TypeVariable<?>)((ParameterizedType)type).getActualTypeArguments()[0];
+            Type theType = InjectionUtils.getSuperType(serviceCls, typeVar);
+            Class<?> cls = theType instanceof Class 
+                ? (Class<?>)theType : InjectionUtils.getActualType(theType, 0);
+            type = new ParameterizedCollectionType(cls);
+        } 
+        if (type == null || type == Object.class) {
+            type = paramCls;
         }
+        return type;
+        
     }
     
 }

Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=1513900&r1=1513899&r2=1513900&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Wed Aug 14 14:40:15 2013
@@ -568,13 +568,8 @@ public final class JAXRSUtils {
         for (int i = 0; i < parameterTypes.length; i++) {
             Class<?> param = parameterTypes[i]; 
             Type genericParam = InjectionUtils.processGenericTypeIfNeeded(
-                ori.getClassResourceInfo().getServiceClass(), genericParameterTypes[i]);
-            if (param == Object.class) {
-                param = (Class<?>)genericParam; 
-            } else if (genericParam == Object.class) {
-                genericParam = param;
-            }
-            
+                ori.getClassResourceInfo().getServiceClass(), param, genericParameterTypes[i]);
+            param = InjectionUtils.updateParamClassToTypeIfNeeded(param, genericParam);
             
             Object paramValue = processParameter(param, 
                                                  genericParam,

Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/SelectMethodCandidatesTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/SelectMethodCandidatesTest.java?rev=1513900&r1=1513899&r2=1513900&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/SelectMethodCandidatesTest.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/SelectMethodCandidatesTest.java Wed Aug 14 14:40:15 2013
@@ -29,6 +29,8 @@ import javax.ws.rs.core.MediaType;
 import org.apache.cxf.endpoint.Endpoint;
 import org.apache.cxf.jaxrs.fortest.BookEntity;
 import org.apache.cxf.jaxrs.fortest.BookEntity2;
+import org.apache.cxf.jaxrs.fortest.ConcreteRestController;
+import org.apache.cxf.jaxrs.fortest.ConcreteRestResource;
 import org.apache.cxf.jaxrs.fortest.GenericEntityImpl;
 import org.apache.cxf.jaxrs.fortest.GenericEntityImpl2;
 import org.apache.cxf.jaxrs.fortest.GenericEntityImpl3;
@@ -127,6 +129,51 @@ public class SelectMethodCandidatesTest 
         assertEquals(2L, book.getId());
         assertEquals("The Book", book.getName());
     }
+    @Test
+    public void testFindFromAbstractGenericImpl5() throws Exception {
+        JAXRSServiceFactoryBean sf = new JAXRSServiceFactoryBean();
+        sf.setResourceClasses(ConcreteRestController.class);
+        sf.create();
+        List<ClassResourceInfo> resources = ((JAXRSServiceImpl)sf.getService()).getClassResourceInfos();
+        Message m = new MessageImpl();
+        m.put(Message.CONTENT_TYPE, "text/xml");
+        Exchange ex = new ExchangeImpl();
+        ex.setInMessage(m);
+        m.setExchange(ex);
+        Endpoint e = EasyMock.createMock(Endpoint.class);
+        e.isEmpty();
+        EasyMock.expectLastCall().andReturn(true).anyTimes();
+        e.size();
+        EasyMock.expectLastCall().andReturn(0).anyTimes();
+        e.getEndpointInfo();
+        EasyMock.expectLastCall().andReturn(null).anyTimes();
+        e.get(ProviderFactory.class.getName());
+        EasyMock.expectLastCall().andReturn(ProviderFactory.getInstance()).times(3);
+        e.get("org.apache.cxf.jaxrs.comparator");
+        EasyMock.expectLastCall().andReturn(null);
+        EasyMock.replay(e);
+        ex.put(Endpoint.class, e);
+        
+        MetadataMap<String, String> values = new MetadataMap<String, String>();
+        ClassResourceInfo resource = JAXRSUtils.selectResourceClass(resources, "/", values,
+                                                                    m);
+        OperationResourceInfo ori = JAXRSUtils.findTargetMethod(resource, 
+                                                                m, 
+                                    "POST", values, "text/xml", 
+                                    JAXRSUtils.sortMediaTypes("*/*"),
+                                    true);
+        assertNotNull(ori);
+        assertEquals("resourceMethod needs to be selected", "add",
+                     ori.getMethodToInvoke().getName());
+        
+        String value = "<concreteRestResource><name>The Book</name></concreteRestResource>";
+        m.setContent(InputStream.class, new ByteArrayInputStream(value.getBytes()));
+        List<Object> params = JAXRSUtils.processParameters(ori, values, m);
+        assertEquals(1, params.size());
+        ConcreteRestResource book = (ConcreteRestResource)params.get(0);
+        assertNotNull(book);
+        assertEquals("The Book", book.getName());
+    }
     
     @Test
     public void testFindFromAbstractGenericClass3() throws Exception {

Modified: cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java?rev=1513900&r1=1513899&r2=1513900&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java (original)
+++ cxf/branches/2.6.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/ResourceUtilsTest.java Wed Aug 14 14:40:15 2013
@@ -30,6 +30,7 @@ import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.core.UriInfo;
+import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.cxf.jaxrs.Customer;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
@@ -132,6 +133,19 @@ public class ResourceUtilsTest extends A
         assertTrue(types.containsKey(Chapter.class));
     }
     
+    @Test
+    public void testGetAllJaxbClassesComplexGenericType() {
+        ClassResourceInfo cri1 = 
+            ResourceUtils.createClassResourceInfo(OrderResource.class, 
+                                                  OrderResource.class, true, true);
+        Map<Class<?>, Type> types = 
+            ResourceUtils.getAllRequestResponseTypes(Collections.singletonList(cri1), true)
+                .getAllTypes();
+        assertEquals(2, types.size());
+        assertTrue(types.containsKey(OrderItemsDTO.class));
+        assertTrue(types.containsKey(OrderItemDTO.class));
+    }
+    
     public interface IProductResource {
         @Path("/parts")
         IPartsResource getParts();
@@ -156,4 +170,24 @@ public class ResourceUtilsTest extends A
         @GET
         Book get();
     }
+    
+    @XmlRootElement
+    public static class OrderItem {
+        
+    }
+    @XmlRootElement
+    public static class OrderItemDTO<T> {
+        
+    }
+    @XmlRootElement
+    public static class OrderItemsDTO<E> {
+        
+    }
+    
+    public static class OrderResource {
+        @GET
+        public OrderItemsDTO<? extends OrderItemDTO<? extends OrderItem>> getOrders() {
+            return null;
+        }
+    }
 }

Modified: cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java?rev=1513900&r1=1513899&r2=1513900&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java (original)
+++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookStoreSpring.java Wed Aug 14 14:40:15 2013
@@ -86,7 +86,7 @@ public class BookStoreSpring {
     @Path("/books/xsitype")
     @Produces("application/xml")
     public Book getBookXsiType() {
-        return new SuperBook("SuperBook", 999L);
+        return new SuperBook("SuperBook", 999L, true);
     }
     
     @SuppressWarnings("unchecked")
@@ -94,7 +94,7 @@ public class BookStoreSpring {
     @Path("/books/superbook")
     @Produces("application/json")
     public <T extends Book> T getSuperBookJson() {
-        SuperBook book = new SuperBook("SuperBook", 999L);
+        SuperBook book = new SuperBook("SuperBook", 999L, true);
         
         return (T)book;
     }
@@ -104,18 +104,20 @@ public class BookStoreSpring {
     @Path("/books/superbooks")
     @Produces("application/json")
     public <T extends Book> List<T> getSuperBookCollectionJson() {
-        SuperBook book = new SuperBook("SuperBook", 999L);
+        SuperBook book = new SuperBook("SuperBook", 999L, true);
         
         return Collections.singletonList((T)book);
     }
     
-    @SuppressWarnings("unchecked")
     @POST
     @Path("/books/superbook")
     @Consumes("application/json")
     @Produces("application/json")
     public <T extends Book> T echoSuperBookJson(T book) {
-        return (T)(SuperBook)book;
+        if (((SuperBook)book).isSuperBook()) {
+            return book;
+        }
+        throw new WebApplicationException(400);
     }
     
     @SuppressWarnings("unchecked")
@@ -124,7 +126,7 @@ public class BookStoreSpring {
     @Consumes("application/json")
     @Produces("application/json")
     public <T extends Book> List<T> echoSuperBookCollectionJson(List<T> book) {
-        if (book.get(0) instanceof SuperBook) {
+        if (((SuperBook)book.get(0)).isSuperBook()) {
             return book;
         }
         throw new WebApplicationException(400);

Modified: cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java?rev=1513900&r1=1513899&r2=1513900&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java (original)
+++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerResourceJacksonSpringProviderTest.java Wed Aug 14 14:40:15 2013
@@ -26,6 +26,8 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
+import javax.ws.rs.core.MediaType;
+
 import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
 
 import org.apache.cxf.helpers.IOUtils;
@@ -94,8 +96,9 @@ public class JAXRSClientServerResourceJa
         BookStoreSpring proxy = JAXRSClientFactory.create(endpointAddress, BookStoreSpring.class, 
             Collections.singletonList(new JacksonJsonProvider()));
         List<SuperBook> books = 
-            proxy.echoSuperBookCollectionJson(Collections.singletonList(new SuperBook("Super", 124L)));
+            proxy.echoSuperBookCollectionJson(Collections.singletonList(new SuperBook("Super", 124L, true)));
         assertEquals(124L, books.get(0).getId());
+        assertTrue(books.get(0).isSuperBook());
     }
     
     @Test
@@ -105,8 +108,93 @@ public class JAXRSClientServerResourceJa
             "http://localhost:" + PORT + "/webapp/store2";
         BookStoreSpring proxy = JAXRSClientFactory.create(endpointAddress, BookStoreSpring.class, 
             Collections.singletonList(new JacksonJsonProvider()));
-        SuperBook book = proxy.echoSuperBookJson(new SuperBook("Super", 124L));
+        SuperBook book = proxy.echoSuperBookJson(new SuperBook("Super", 124L, true));
+        assertEquals(124L, book.getId());
+        assertTrue(book.isSuperBook());
+    }
+    
+    @Test
+    public void testEchoGenericSuperBookCollectionProxy() throws Exception {
+        
+        String endpointAddress =
+            "http://localhost:" + PORT + "/webapp/genericstore";
+        GenericBookStoreSpring proxy = JAXRSClientFactory.create(endpointAddress, 
+            GenericBookStoreSpring.class, Collections.singletonList(new JacksonJsonProvider()));
+        List<SuperBook> books = 
+            proxy.echoSuperBookCollectionJson(Collections.singletonList(new SuperBook("Super", 124L, true)));
+        assertEquals(124L, books.get(0).getId());
+        assertTrue(books.get(0).isSuperBook());
+    }
+    
+    @Test
+    public void testEchoGenericSuperBookProxy() throws Exception {
+        
+        String endpointAddress =
+            "http://localhost:" + PORT + "/webapp/genericstore";
+        GenericBookStoreSpring proxy = JAXRSClientFactory.create(endpointAddress, 
+            GenericBookStoreSpring.class, Collections.singletonList(new JacksonJsonProvider()));
+        SuperBook book = proxy.echoSuperBookJson(new SuperBook("Super", 124L, true));
+        assertEquals(124L, book.getId());
+        assertTrue(book.isSuperBook());
+    }
+    
+    @Test
+    public void testEchoGenericSuperBookWebClient() throws Exception {
+        
+        String endpointAddress = 
+            "http://localhost:" + PORT + "/webapp/genericstore/books/superbook";
+        WebClient wc = WebClient.create(endpointAddress, 
+                                        Collections.singletonList(new JacksonJsonProvider()));
+        wc.accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON);
+        SuperBook book = wc.post(new SuperBook("Super", 124L, true), SuperBook.class);
+        assertEquals(124L, book.getId());
+        assertTrue(book.isSuperBook());
+    }
+    
+    @Test
+    public void testEchoGenericSuperBookWebClientXml() throws Exception {
+        
+        String endpointAddress = 
+            "http://localhost:" + PORT + "/webapp/genericstore/books/superbook";
+        WebClient wc = WebClient.create(endpointAddress);
+        wc.accept(MediaType.APPLICATION_XML).type(MediaType.APPLICATION_XML);
+        SuperBook book = wc.post(new SuperBook("Super", 124L, true), SuperBook.class);
+        assertEquals(124L, book.getId());
+        assertTrue(book.isSuperBook());
+    }
+    
+    @Test
+    public void testEchoGenericSuperBookCollectionWebClient() throws Exception {
+        
+        String endpointAddress = 
+            "http://localhost:" + PORT + "/webapp/genericstore/books/superbooks";
+        WebClient wc = WebClient.create(endpointAddress, 
+                                        Collections.singletonList(new JacksonJsonProvider()));
+        WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(100000000L);
+        wc.accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON);
+        Collection<? extends SuperBook> books = 
+            wc.postAndGetCollection(Collections.singletonList(new SuperBook("Super", 124L, true)),
+                                    SuperBook.class,
+                                    SuperBook.class);
+        SuperBook book = books.iterator().next();
+        assertEquals(124L, book.getId());
+        assertTrue(book.isSuperBook());
+    }
+    
+    @Test
+    public void testEchoGenericSuperBookCollectionWebClientXml() throws Exception {
+        
+        String endpointAddress = 
+            "http://localhost:" + PORT + "/webapp/genericstore/books/superbooks";
+        WebClient wc = WebClient.create(endpointAddress);
+        wc.accept(MediaType.APPLICATION_XML).type(MediaType.APPLICATION_XML);
+        Collection<? extends SuperBook> books = 
+            wc.postAndGetCollection(Collections.singletonList(new SuperBook("Super", 124L, true)),
+                                    SuperBook.class,
+                                    SuperBook.class);
+        SuperBook book = books.iterator().next();
         assertEquals(124L, book.getId());
+        assertTrue(book.isSuperBook());
     }
     
     @Test

Modified: cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java?rev=1513900&r1=1513899&r2=1513900&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java (original)
+++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerSpringBookTest.java Wed Aug 14 14:40:15 2013
@@ -367,7 +367,7 @@ public class JAXRSClientServerSpringBook
         WebClient wc = WebClient.create(address, Collections.singletonList(provider));
         wc.accept("application/xml");
         wc.type("application/xml");
-        SuperBook book = new SuperBook("SuperBook2", 999L);
+        SuperBook book = new SuperBook("SuperBook2", 999L, true);
         Book book2 = wc.invoke("POST", book, Book.class, Book.class);
         assertEquals("SuperBook2", book2.getName());
         
@@ -381,7 +381,7 @@ public class JAXRSClientServerSpringBook
         provider.setJaxbElementClassNames(Collections.singletonList(Book.class.getName()));
         BookStoreSpring bookStore = JAXRSClientFactory.create(address, BookStoreSpring.class, 
                                                               Collections.singletonList(provider));
-        SuperBook book = new SuperBook("SuperBook2", 999L);
+        SuperBook book = new SuperBook("SuperBook2", 999L, true);
         Book book2 = bookStore.postGetBookXsiType(book);
         assertEquals("SuperBook2", book2.getName());
         

Modified: cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/SuperBook.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/SuperBook.java?rev=1513900&r1=1513899&r2=1513900&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/SuperBook.java (original)
+++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/SuperBook.java Wed Aug 14 14:40:15 2013
@@ -23,13 +23,23 @@ import javax.xml.bind.annotation.XmlRoot
 
 
 @XmlRootElement(name = "SuperBook")
-public class SuperBook extends Book {
+public class SuperBook extends Book implements SuperBookInterface {
+    private boolean superBook;
     
     public SuperBook() {
         
     }
     
-    public SuperBook(String name, long id) {
+    public SuperBook(String name, long id, boolean superStatus) {
         super(name, id);
+        this.superBook = superStatus;
+    }
+
+    public boolean isSuperBook() {
+        return superBook;
+    }
+
+    public void setSuperBook(boolean superBook) {
+        this.superBook = superBook;
     }
 }

Modified: cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml
URL: http://svn.apache.org/viewvc/cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml?rev=1513900&r1=1513899&r2=1513900&view=diff
==============================================================================
--- cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml (original)
+++ cxf/branches/2.6.x-fixes/systests/jaxrs/src/test/resources/jaxrs_jackson_provider/WEB-INF/beans.xml Wed Aug 14 14:40:15 2013
@@ -47,7 +47,18 @@ http://cxf.apache.org/schemas/jaxrs.xsd"
         </jaxrs:providers>
     </jaxrs:server>
     
+    <jaxrs:server id="genericBookStore"
+                  address="/genericstore">
+        <jaxrs:serviceBeans>
+            <ref bean="gBookStore"/>
+        </jaxrs:serviceBeans>
+        <jaxrs:providers>
+            <ref bean="jackson"/>
+        </jaxrs:providers>
+    </jaxrs:server>
+    
     <bean id="jackson" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>
     <bean id="bookstore" class="org.apache.cxf.systest.jaxrs.BookStore"/>
     <bean id="bookstore2" class="org.apache.cxf.systest.jaxrs.BookStoreSpring"/>
+    <bean id="gBookStore" class="org.apache.cxf.systest.jaxrs.GenericBookStoreSpring"/>
 </beans>