Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ProxyFactoryBean为目标类返回空类对象_Java_Spring - Fatal编程技术网

Java ProxyFactoryBean为目标类返回空类对象

Java ProxyFactoryBean为目标类返回空类对象,java,spring,Java,Spring,我在ProxyFactoryBean类中面临问题 我们想要得到ProxyFactoryBean的targetBean的类名 当我们调用BeanFactory上的getType并给出bean名称时,它总是以null返回 我们的Java代码是 public class TestSpring { public static void main(String args[]){ TestSpring ts = new TestSpring(); ts.process();

我在
ProxyFactoryBean
类中面临问题

我们想要得到
ProxyFactoryBean
targetBean
的类名

当我们调用
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>

我想在这里补充一些其他的东西

  • 如果我们把这个bean做成单体,它就会工作。但在我们的例子中,我们希望它是一个原型
  • 我们必须使用
    BeanFactory.getType()
    。这是我们打电话的基本框架。我们不能改变我们的基本框架
  • targetSource
    能解决这个问题吗?我试过了,但没用。可能是我用错了吗
  • 我正在使用Spring2.0.6
  • 问候
    Ankit

    文档说明,如果类型不可确定,则该方法返回
    null
    。我找不到关于这意味着什么的参考资料,但考虑到这些症状,我认为这是不可确定的,因为原型的范围。(bean存在,否则将引发异常)


    在查看了源代码之后,我看不到返回
    null
    的原因-如果没有单例,则参考bean定义。我的建议是尝试暂时获取spring 2.5.6(或3.0.x),看看这个问题是否可以复制或修复。

    我面临同样的问题,在调试时发现AbstractBeanFactory中的getTypeForFactoryBean函数工作不正常。此函数为原型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;
                }
            }
    

    理想情况下,上述函数应该在ProxyFactoryInstance上调用getObjectType,但由于对singleton的第一次检查,上述函数返回NULL

    谢谢你的回复。我试过2.5.6和3.0。我得到了同样的结果。我确实调试了Spring源代码。我觉得这里有问题。对于我的案例,调用将进入AbstractAutowireCapableBeanFactory.getNonSingletonFactoryBeanForType检查。在这里,它创建了一个基本的ProxyFactoryBean类,没有注入任何属性。创建此对象后,将调用工厂bean的getObjectType。这里,它正在寻找targetClass来获取对象类型。但由于targetClass没有被注入,它返回null。@Ankit将其报告为bug。他们会验证它并提供更多的见解。谢谢。我已将问题记录在JIRA中