0

いくつかのメソッドを持つ 1 つの Annotation Bean があります。それは正常に動作します。

public @Controller("adminController") class AdminController {

...
private @Autowired AdminDAO adminDAO;

public void resetTemporalList() {

    System.out.println("HE SIDO EJECUTADO.");

    this.adminDAO.resetTemporalRegisters();
}

...

}

現在、1 つのクオーツ タスクを統合しています。しかし、以前のアノテーション Bean を呼び出す XML 定義 Bean をロードしています。

<bean id="resetTemporalRegisters" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject" ref="adminController" />
    <property name="targetMethod" value="resetTemporalList" />
    <property name="concurrent" value="false" />
</bean>

アプリを起動すると、次のエラーが表示されます。

原因: org.springframework.beans.factory.NoSuchBeanDefinitionException: 'adminController' という名前の Bean が定義されていません

問題は、Spring がアノテーション Bean の後に最初に XML Bean をロードし、この瞬間に「adminController」Bean が終了しないことだと思います...

どうすれば修正できますか?

解決しました!!

問題は、xml Bean 定義を applicationContext.xml に入れたことです。

4

2 に答える 2

0

少し推測します。コントローラーはresetTemporalRegisters、メインアプリケーションコンテキスト(親)で作業しているときに、SpringMVCによって作成された子アプリケーションコンテキストで定義されます。子コンテキストは親コンテキストからBeanにアクセスできますが、その逆はできません。

これは重要な質問を提起します:なぜあなたのビジネスロジックはコントローラーのメソッドを呼び出そうとしているのですか?これらのメソッドは、MVCフレームワークでのみ呼び出す必要があります。ただ電話できない

this.adminDAO.resetTemporalRegisters();

あなたの仕事から直接?

<bean id="resetTemporalRegisters" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <property name="targetObject" ref="adminDAO" />
  <property name="targetMethod" value="resetTemporalRegisters" />
  <property name="concurrent" value="false" />
</bean>

adminDAOおそらく親コンテキストで定義されているため、簡単にアクセスできます。

于 2012-04-27T16:07:26.380 に答える
0

いいえ、XML と注釈は問題なく統合されていますが、XML にコンポーネント スキャン コードが実際に含まれているのでしょうか?

<context:component-scan base-package="com.yourcompany.yourapp"/>

参照: 4.10 クラスパスのスキャンと管理対象コンポーネント

于 2012-04-27T16:05:39.633 に答える