Spring id-reference无法按预期工作

时间:2013-10-21 21:03:10

标签: spring configuration

我正在使用Spring Framework参考文档和一些非常基本的应用程序代码。到目前为止,我已经从XML文件创建了一个ApplicationContext并加载了一些bean。我相信我很了解这个过程。我已经加载了一些基于bean的基本类型的基本bean,发现它很直接。

我现在正在研究一个复合bean,其他bean作为其属性。到目前为止,我已经能够使用对bean和内部bean的直接引用来设置这些属性。但是,当我尝试让idref元素生效时(请参阅http://docs.spring.io/spring/docs/3.2.4.RELEASE/spring-framework-reference/html/beans.html#beans-idref-element),我得到以下异常:

java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.example.BasicBean] for property 'idRef': no matching editors or conversion strategy found

以下代码段:

应用程序上下文XML

<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
<bean id="id-bean" class="com.example.BasicBean" scope="singleton">
   <property name="value" value="31"/>
</bean>
<bean id="ref-bean" class="com.example.BasicBean" scope="singleton">
  <property name="value" value="37"/>
</bean>
<bean id="cb" class="com.example.CompositeBean" scope="singleton">
  <property name="id" ref="id-bean"/>   <!-- works -->
  <property name="inner">               <!-- works -->
    <bean class="com.example.BasicBean">
      <property name="value" value="43"/>
    </bean>
  </property>
  <property name="idRef">               <!-- exception thrown -->
    <idref bean="ref-bean"/>
  </property>
</bean>
</beans>

Java App Code

public void main()
{
  context = new ClassPathXmlApplicationContext("beans.xml");
  CompositeBean cb = context.getBean("cb", CompositeBean.class);
}

Java Bean代码

public class CompositeBean
{
  private BasicBean id;
  private BasicBean idRef;
  private BasicBean inner;
  // Default constructor exists
  // Setters, getters for each attribute exist
  ...
}

public class BasicBean
{
  private int value;
  // Default constructor exists
  // Setters, getters for each attribute exist
  ...
}

版本信息:我正在使用Eclipse IDE(Kepler),Maven 3.1,Java 7(1.7.45),Spring 3.2.4

对我做错了什么的想法?

1 个答案:

答案 0 :(得分:0)

感谢@Farid指出我错误地使用了此实例中的idref属性。正如Spring doco指出的那样(我已经多次读过并且仍然错过了它)它被设计用于将bean的 id 传递给容器而不是实际的bean。所以,坚持上面的前两个方法(ref和内部bean)来传递bean。