2012-02-02 92 views
1

我有一個Jersey Spring應用程序。我無法弄清楚是什麼導致它拉入Spring XML配置文件,我沒有告訴它使用。爲什麼Spring組件掃描查找XML文件?

這裏是我的applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 

    xsi:schemaLocation="http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 

    <!--<import resource="classpath:com/lala/spring/settings.xml"/>--> 

    <context:component-scan base-package="com.lala.service, 
             com.lala.bin"/> 

</beans> 

的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 

    <servlet> 
     <servlet-name>ServletAdaptor</servlet-name> 
     <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>ServletAdaptor</servlet-name> 
     <url-pattern>/*</url-pattern> 
    </servlet-mapping> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 

    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
</web-app> 

的settings.xml位於/com/lala/spring/settings.xml那麼,爲什麼是地獄Tomcat的印刷本:

Feb 2, 2012 11:35:57 AM org.springframework.web.context.ContextLoader initWebApplicationContext 
INFO: Root WebApplicationContext: initialization started 
Feb 2, 2012 11:35:57 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh 
INFO: Refreshing Root WebApplicationContext: startup date [Thu Feb 02 11:35:57 EST 2012]; root of context hierarchy 
Feb 2, 2012 11:35:57 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/applicationContext.xml] 
Feb 2, 2012 11:35:57 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [com/syncwords/spring/settings.xml] 
Feb 2, 2012 11:35:58 AM org.springframework.context.support.AbstractApplicationContext$BeanPostProcessorChecker postProcessAfterInitialization 

如果我取消註釋實際<進口>然後我看到「正在加載XML。 ..settings.xml「TWICE,並獲得警告,它的bean被雙重初始化。如果我刪除「組件掃描」並手動定義一些bean,那麼一切正常。

我使用Spring 3.1.0-RELEASE

+1

你可以請張貼web.xml - 我有這種感覺,這觸發settings.xml – Ralph 2012-02-02 17:01:22

+0

@Ralph做.... – 2012-02-02 17:21:24

+0

看起來沒問題,你有沒有嘗試重命名'settings.xml'的東西其他?可能有一些魔法默認加載'settings.xml',或者某處是被忽視的配置。 – Ralph 2012-02-02 17:46:56

回答

0

這是令人發狂的調試,因爲Netbeans的/ Tomcat不正確清除運行之間的大腦。 (事實證明你必須手動刪除Tomcat目錄並執行Clean & Build。)但是罪魁禍首是一個使用@RunAs(SpringJUnit4ClassRunner.class)和@ContextConfiguration(我的源代碼中有測試類)註釋的測試類。

我認爲這是一個在Spring中的錯誤,並將它作爲這樣的文件,因爲測試類創建自己的上下文(通過特殊類跑步者),並沒有地方被組件掃描。