0

我正在使用一些非常基本的应用程序代码浏览 Spring Framework 参考文档。到目前为止,我已经ApplicationContext从一个 XML 文件创建了一个并加载了一些 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 应用程序代码

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

对我做错了什么有任何想法吗?

4

1 回答 1

0

感谢@Farid 指出我idref在这种情况下误用了该属性。正如 Spring doco 指出的那样(我已经读了好几遍但仍然错过了这一点),它旨在将 bean 的id传递给容器而不是实际的 bean。所以,坚持上面的前两种方法(参考和内部 bean)来传递一个 bean。

于 2013-10-22T05:12:04.640 回答