2010-10-02 50 views
3

我面臨的問題ProxyFactoryBean類返回null類對象,ProxyFactryBean是對目標

我們想要得到的ProxyFactoryBeantargetBean的類名。

當我們調用BeanFactory上的getType給出bean名稱時,它總是返回null。

我們的Java代碼

public class TestSpring { 
    public static void main(String args[]){  
    TestSpring ts = new TestSpring(); 
    ts.process(); 
    } 

    private void process() { 
    BeanFactory factory = new XmlBeanFactory(new FileSystemResource("E:\\beans.xml")); 
    Class c = factory.getType("scor.imagedev.action.imageDevServerTaskActions"); 
    System.out.println(c); 
    } 
} 

我們的配置文件如下:

<bean id="scor.actionProxyTemplate" class="org.springframework.aop.framework.ProxyFactoryBean" abstract="true" > 
    <property name="proxyTargetClass" value="true" />  
</bean> 

<bean id="scor.imagedev.action.imageDevServerTaskActions" parent="scor.actionProxyTemplate" scope="prototype">  
    <property name="target"> 
    <bean class="test.spring.Foo"/> 
    </property> 
</bean> 

一些我想在這裏添加其他東西。

  1. 如果我們將bean作爲單例,它就可以工作。但在我們的案例中,我們希望它成爲一個原型。我們不得不使用BeanFactory.getType(<beanName>)。這是我們的基礎框架撥打電話。我們不能改變我們的基本框架。
  2. 請問targetSource能解決這個問題嗎?我試過了,但沒用。可能是我錯誤地使用了
  3. 我正在使用Spring 2.0.6。

問候 ANKIT

回答

0

文檔說,該方法,如果類型是無法確定返回null。我無法找到這是什麼意思的參考,但考慮到症狀,我會認爲它是不可確定的,因爲原型範圍。 (這個bean存在,否則會拋出一個異常)

看完源代碼後,我看不到返回的原因null - 如果沒有singleton,則會查閱bean定義。我可以建議的是嘗試暫時獲得spring 2.5.6(或3.0.x)並查看問題是否可以複製或修復。

+1

感謝您的回覆。我曾用2.5.6和3.0試過。我得到了同樣的結果。我確實調試了Spring的源代碼。我不知何故在這裏聞到一個問題。對於我的案例調用正在進行AbstractAutowireCapableBeanFactory.getNonSingletonFactoryBeanForType檢查。這裏它創建了一個沒有注入屬性的基本ProxyFactoryBean類。在創建該對象後,將調用factory bean的getObjectType。在這裏它正在尋找targetClass來獲取對象類型。但由於targetClass沒有被注入,所以它返回null。 – Ankit 2010-10-03 06:46:18

+0

@Ankit將其報告爲一個錯誤。他們會驗證它並提供更多見解。 – Bozho 2010-10-03 07:08:08

0

我面臨同樣的問題,並且在調試時發現,AbstractBeanFactory中的getTypeForFactoryBean函數沒有正常工作。這個函數爲protoType bean返回NULL。

/** 
    * Determine the bean type for the given FactoryBean definition, as far as possible. 
    * Only called if there is no singleton instance registered for the target bean already. 
    * <p>The default implementation creates the FactoryBean via <code>getBean</code> 
    * to call its <code>getObjectType</code> method. Subclasses are encouraged to optimize 
/
protected Class getTypeForFactoryBean(String beanName, RootBeanDefinition mbd) { 
      if (!mbd.isSingleton()) { 
       return null; 
      } 
      try { 
       FactoryBean factoryBean = (FactoryBean) getBean(FACTORY_BEAN_PREFIX + beanName); 
       return getTypeForFactoryBean(factoryBean); 
      } 
      catch (BeanCreationException ex) { 
       // Can only happen when getting a FactoryBean. 
       logger.debug("Ignoring bean creation exception on FactoryBean type check", ex); 
       return null; 
      } 
     } 

理想上面的函數應該調用getObjectType上ProxyFactoryInstance,但由於對單身上述函數返回NULL第一次檢查。

+0

謝謝。我在JIRA https://jira.springsource.org/browse/SPR-7615上記錄了這個問題 – Ankit 2010-10-04 09:15:57