1

私の XML 構成には、次の Bean 定義が含まれています。

<bean id="abstractFormAction" class="staffing.server.action.form.AbstractFormAction" abstract="true" parent="baseAction">
    <property name="volunteerSaver" ref="volunteerSaver"/>
    <property name="emailSender" ref="emailSender"/> 
    <property name="closed" value="${form.closed}"/>
</bean>

<bean id="volunteerFormAction" class="staffing.server.action.form.VolunteerFormAction" parent="abstractFormAction">
    <property name="captchaGenerator" ref="captcha"/>
</bean>

VolunteerFormAction が AbstactFormAction の具体的な実装であり、AbstactFormAction のプロパティを継承することを示します。

AbstractFormAction では、次のようにプロパティを宣言します。

@Autowired protected VolunteerSaver volunteerSaver;
@Autowired protected EmailSender emailSender;
@Autowired protected boolean closed;

デプロイしようとすると、次の例外が発生します。

org.springframework.beans.factory.BeanCreationException: 'volunteerFormAction' という名前の Bean の作成中にエラーが発生しました: 自動配線された依存関係の注入に失敗しました。ネストされた例外は org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected boolean staffing.server.action.form.AbstractFormAction.closed; です。ネストされた例外は org.springframework.beans.factory.NoSuchBeanDefinitionException: 依存関係に一致するタイプ [boolean] の Bean が見つかりません: この依存関係のオートワイヤー候補として適格な少なくとも 1 つの Bean が必要です。依存関係アノテーション: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

byte boolean の bean が見つからないと文句を言っているようです。しかし、参照ではなく値でプロパティ 'closed' を定義した場合、なぜ Bean が必要なのでしょうか?

4

3 に答える 3

5

プロパティプレースホルダーを使用して値を渡すには、 @Valueアノテーションを使用する必要があります。@Autowire は、指定されたタイプの Bean が applicationContext に存在することを期待します。

値を自動配線している場合、Bean 定義に値を渡すのはなぜですか? 必要なのは

<bean id="abstractFormAction" class="staffing.server.action.form.AbstractFormAction" abstract="true" parent="baseAction"><bean>
<bean id="volunteerFormAction" class="staffing.server.action.form.VolunteerFormAction" parent="abstractFormAction">
    <property name="captchaGenerator" ref="captcha"/>
</bean>

@Autowired protected VolunteerSaver volunteerSaver;
@Autowired protected EmailSender emailSender;
@Value("#{form.closed}") protected boolean closed;

component-scanを使用できる場合は、Bean の作成を指定する必要さえありません

<context:component-scan base-package="<your base package>"/>context.xml ファイルに追加し@Controllerて、コントローラー ファイルに注釈を追加できます。

于 2013-02-23T15:17:00.733 に答える
0

closedで注釈を付けるべきではありません@Autowired

@Autowiredコンテキストで自動配線されたフィールドのタイプ(ブール値)のBeanを検索するようにSpringに指示します。そのため、「タイプ[ブール値]の一致するBeanがありません」と不平を言っています

xml 構成から値を挿入する場合、そのフィールドに注釈を付ける必要はありません。

于 2013-02-23T15:15:43.600 に答える
0

表示されたコードに基づいて、Spring コンテキストをロードする方法に問題がある可能性があります。私の推測では、ルート Web アプリケーション コンテキストと、コントローラーが存在するはずの子コンテキストの両方で、コントローラーを誤ってコンポーネント スキャンしていると思われます。つまり、このクラスのインスタンスが2 つ作成され、そのうちの 1 つだけが XML 経由で構成されていることを意味します。Spring は他のインスタンスを自動配線しようとしていますが、指定されたエラーで失敗しています。次のような他のいくつかの SO 回答で、問題と解決策の説明を見つけることができます。

親コンテキストと子コンテキストでSpring Beanを宣言する

Spring XML ファイル構成階層のヘルプ/説明

Spring-MVC:「コンテキスト」と「名前空間」とは何ですか?

構成ファイルとコンテキスト構成についてさらに詳しく説明すると、どこが間違っているかを誰かが正確に指摘できるかもしれません。

于 2013-02-23T16:03:07.633 に答える