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 2015/12/06 19:13:44 UTC

cxf git commit: [CXF-6694] Getting SpringResourcefactory recognize contructor-autowired beans, patch from Vladimir Kulev applied with thanks

Repository: cxf
Updated Branches:
  refs/heads/master 310847cee -> cdd1a9c9b


[CXF-6694] Getting SpringResourcefactory recognize contructor-autowired beans, patch from Vladimir Kulev applied with thanks


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/cdd1a9c9
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/cdd1a9c9
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/cdd1a9c9

Branch: refs/heads/master
Commit: cdd1a9c9b7731606fa3a35e0213d50282382b8bb
Parents: 310847c
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Sun Dec 6 18:13:25 2015 +0000
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Sun Dec 6 18:13:25 2015 +0000

----------------------------------------------------------------------
 .../cxf/jaxrs/spring/SpringResourceFactory.java | 29 ++++++++++++--------
 .../jaxrs/spring/SpringResourceFactoryTest.java | 17 ++++++++----
 .../org/apache/cxf/jaxrs/spring/servers2.xml    |  4 ++-
 3 files changed, 31 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/cdd1a9c9/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/SpringResourceFactory.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/SpringResourceFactory.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/SpringResourceFactory.java
index 826f619..ba0fee1 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/SpringResourceFactory.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/SpringResourceFactory.java
@@ -44,6 +44,7 @@ import org.springframework.context.ApplicationContextAware;
 public class SpringResourceFactory implements ResourceProvider, ApplicationContextAware {
 
     private Constructor<?> c;
+    private Class<?> type;
     private ApplicationContext ac;
     private String beanId;
     private Method postConstructMethod;
@@ -65,26 +66,30 @@ public class SpringResourceFactory implements ResourceProvider, ApplicationConte
     }
     
     private void init() {
-        Class<?> type = ClassHelper.getRealClassFromClass(ac.getType(beanId));
+        type = ClassHelper.getRealClassFromClass(ac.getType(beanId));
         if (Proxy.isProxyClass(type)) {
             type = ClassHelper.getRealClass(ac.getBean(beanId));
         }
-        c = ResourceUtils.findResourceConstructor(type, !isSingleton());
-        if (c == null) {
-            throw new RuntimeException("Resource class " + type
-                                       + " has no valid constructor");
-        }
+        isSingleton = ac.isSingleton(beanId);
         postConstructMethod = ResourceUtils.findPostConstructMethod(type, postConstructMethodName);
         preDestroyMethod = ResourceUtils.findPreDestroyMethod(type, preDestroyMethodName);
-        isSingleton = ac.isSingleton(beanId);
-        if (!isSingleton) {
-            isPrototype = ac.isPrototype(beanId);
-        } else {
+        
+        if (isSingleton()) {
             try {
                 singletonInstance = ac.getBean(beanId);
             } catch (BeansException ex) {
-                // ignore for now, can be to do with no default constructor available
+                // ignore for now, try resolving resource constructor later
+            }
+            if (singletonInstance != null) {
+                return;
             }
+        } else {
+            isPrototype = ac.isPrototype(beanId);
+        }
+        c = ResourceUtils.findResourceConstructor(type, !isSingleton());
+        if (c == null) {
+            throw new RuntimeException("Resource class " + type
+                                       + " has no valid constructor");
         }
         
     }
@@ -156,7 +161,7 @@ public class SpringResourceFactory implements ResourceProvider, ApplicationConte
      * {@inheritDoc}
      */
     public Class<?> getResourceClass() {
-        return c.getDeclaringClass();
+        return type;
     }
 
     public void setCallPostConstruct(boolean callPostConstruct) {

http://git-wip-us.apache.org/repos/asf/cxf/blob/cdd1a9c9/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/spring/SpringResourceFactoryTest.java
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/spring/SpringResourceFactoryTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/spring/SpringResourceFactoryTest.java
index e1119aa..a712e14 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/spring/SpringResourceFactoryTest.java
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/spring/SpringResourceFactoryTest.java
@@ -21,10 +21,12 @@ package org.apache.cxf.jaxrs.spring;
 import java.lang.reflect.Constructor;
 import java.util.List;
 
+
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
 import org.apache.cxf.jaxrs.resources.BookStore;
+import org.apache.cxf.jaxrs.resources.BookStoreConstructor;
 
 import org.junit.After;
 import org.junit.Assert;
@@ -56,8 +58,8 @@ public class SpringResourceFactoryTest extends Assert {
         List<ClassResourceInfo> list = factoryBean.getServiceFactory().getClassResourceInfo();
         assertNotNull(list);
         assertEquals(4, list.size());
-        assertSame(BookStore.class, list.get(0).getServiceClass());
-        assertSame(BookStore.class, list.get(0).getResourceClass());
+        assertSame(BookStoreConstructor.class, list.get(0).getServiceClass());
+        assertSame(BookStoreConstructor.class, list.get(0).getResourceClass());
         assertSame(BookStore.class, list.get(1).getServiceClass());
         assertSame(BookStore.class, list.get(1).getResourceClass());
     }
@@ -68,10 +70,13 @@ public class SpringResourceFactoryTest extends Assert {
         assertNotNull(bean);
         SpringResourceFactory sf = (SpringResourceFactory)bean;
         assertNotNull(sf.getApplicationContext());
-        Constructor<?> c = sf.getBeanConstructor();
-        Constructor<BookStore> c2 = BookStore.class.getConstructor(new Class[]{});
-                
-        assertEquals(c.getParameterTypes().length, c2.getParameterTypes().length);
         assertEquals(isSingleton, sf.isSingleton());
+        if (!isSingleton) {
+            Constructor<?> c = sf.getBeanConstructor();
+            Constructor<BookStore> c2 = BookStore.class.getConstructor(new Class[]{});
+                    
+            assertEquals(c.getParameterTypes().length, c2.getParameterTypes().length);
+        }
+        
     }
 }

http://git-wip-us.apache.org/repos/asf/cxf/blob/cdd1a9c9/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/spring/servers2.xml
----------------------------------------------------------------------
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/spring/servers2.xml b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/spring/servers2.xml
index f05954b..54925b4 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/spring/servers2.xml
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/spring/servers2.xml
@@ -39,7 +39,9 @@
     <bean id="sfactory2" class="org.apache.cxf.jaxrs.spring.SpringResourceFactory">
         <property name="beanId" value="bookstore2"/>
     </bean>
-    <bean id="bookstore1" class="org.apache.cxf.jaxrs.resources.BookStore"/>
+    <bean id="bookstore1" class="org.apache.cxf.jaxrs.resources.BookStoreConstructor">
+        <constructor-arg value="CXF" />
+    </bean>
     <bean id="bookstore2" class="org.apache.cxf.jaxrs.resources.BookStore" scope="prototype"/>
     <bean id="bookstore3" class="org.apache.cxf.jaxrs.resources.BookStore"/>
     <bean id="bookstore4" class="org.apache.cxf.jaxrs.resources.BookStore" scope="prototype"/>