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

idrefこのインスタンスで属性を誤用していたことを指摘してくれた@Faridに感謝します。Spring doco が指摘しているように (私は何度か読みましたが、まだこれを見逃していました) 、実際の Bean ではなく、コンテナーの周りに BeanのIDを渡すように設計されています。したがって、Bean を渡すための上記の最初の 2 つの手段 (ref と内部 Bean) に固執してください。

于 2013-10-22T05:12:04.640 に答える