15

以下のように定義された spring.xml があります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="triangle" class="org.tutorial.spring.Triangle">
    <property name="pointA">
        <idref bean="pointA"/>
    </property>
    <property name="pointB" ref="pointB"/>
    <property name="pointC" ref="pointC"/>
</bean>
<bean id="pointA" class="org.tutorial.spring.Point">
    <property name="x" value="0"/>
    <property name="y" value="0"/>
</bean>
<bean id="pointB" class="org.tutorial.spring.Point">
    <property name="x" value="100"/>
    <property name="y" value="200"/>
</bean>
<bean id="pointC" class="org.tutorial.spring.Point">
    <property name="x" value="-100"/>
    <property name="y" value="-200"/>
</bean>
</beans>

このPointクラスは、基本的に 2 つのプライベート int メンバーを持つクラスです。私の問題は、以下のように IDREF でエラーが発生することです。

Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.lang.String' to required type 'org.tutorial.spring.Point' for property 'pointA'; 
nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.tutorial.spring.Point] for property 'pointA': no matching editors or conversion strategy found

私が理解している限り、IDREF (上記の場合) の目的は、BeanPointAが存在する (エラー チェック) ための Bean トライアングルです。PointAそのため、IDREF 要素に Bean の名前(文字列) を指定しました。上記のエラーが発生するのはなぜですか? 名前を指定するだけ

で Bean ( ) の存在をチェックしているだけだと思っていたのに、なぜ文字列を Point に変換しようとしているのでしょうか?PointA

私は本当に混乱しています。助けてください。ありがとう。

4

5 に答える 5

13

idrefBean (つまり、文字列)の名前 (識別子)を渡すために使用されます。

<idref bean="pointA">pointAそのような Bean が定義されていない場合に Spring が文句を言うことを除いて、 string value とまったく同じです。

詳細については、Spring のドキュメントを参照してください。

実際の Bean を渡すには、 と の場合とまったく同じように を使用しrefます。pointBpointC

于 2013-01-30T16:18:25.280 に答える
13

idref 要素は、コンテナ内の別の Bean の ID (文字列値 - 参照ではない) を or 要素に渡す単純なエラー防止方法です。

簡単に言えば、idref 要素は文字列値を渡すために使用され、idref タグを使用すると、コンテナーはデプロイ時に、参照された名前付き Bean が実際に存在することを検証できます。

以下の例を検討してください

クラス FirstBean

クラス SecondBean

アプリケーションコンテキストでの Bean 定義

Bean をインスタンス化するための呼び出しコード

コンソールでの出力

secondBean.getSecondMessage() を呼び出したときのコンソールの出力に注目してください。値は、idref 属性を使用して設定された firstBean です。

注: この要素が価値をもたらす一般的な場所は、ProxyFactoryBean Bean 定義の AOP インターセプターの構成です。インターセプター名を指定するときに要素を使用すると、インターセプター ID のスペルミスを防ぐことができます。

于 2013-08-30T18:17:28.710 に答える
0

私は言わなければならない少し当惑しています。praveen を提供する例では、クラスの属性が String 型であるため機能しますが、yapkm01 の例では、属性は Point 型であり、言及された例外が発生します。idref を使用できるようにするには、タイプ String の別の属性、ここでは「メッセージ」を導入する必要があるようです。コードは次のようになります。

<property name="message">
    <idref bean="zeroPoint" />
</property>

<property name="pointA" ref="zeroPoint"/>
于 2013-12-02T13:43:48.837 に答える