2012-04-27 47 views
0

我有一個帶有一些方法的Annotation bean。它工作正常。Spring,XML beans在應用程序啓動時調用Annotation beans

public @Controller("adminController") class AdminController { 

... 
private @Autowired AdminDAO adminDAO; 

public void resetTemporalList() { 

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

    this.adminDAO.resetTemporalRegisters(); 
} 

...

}

現在,我整合一個石英任務。但是我使用調用previus註釋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」豆被定義

我相信問題是Spring加載XML豆第一,註釋豆後,再在這一刻「adminController」bean不存在...

我該如何解決它?

已解決!

問題在於我把xml bean定義放在applicationContext.xml中。

回答

0

不,XML和註釋集成得很好,但是你真的在你的XML中有組件掃描代碼嗎?

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

參見:4.10 Classpath scanning and managed components

+0

當然,其他應用程序未找到。 – Dani 2012-04-27 16:07:42

0

猜測的一點:你的控制器是由Spring MVC中創建的子應用程序上下文的定義,同時你resetTemporalRegisters工作在主應用程序上下文(父)。子上下文可以從父上下文訪問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在父上下文中可能的,所以您可以輕鬆地訪問它。

+0

adminDAO @ Repository擴展了baseDAO @ Repository,我爲此創建了一個新的註解@Parent。與您的建議我得到同樣的錯誤。 「由:org.springframework.beans.factory.NoSuchBeanDefinitionException導致:沒有名爲'adminDAO'的bean被定義爲」 – Dani 2012-04-27 16:15:34