![](/img/trans.png)
[英]Why is maven looking for `webapp\WEB-INF\web.xml` instead of `web-app\WEB-INF\web.xml`
[英]WEB-INF/myproject-servlet.xml versus WEB-INF/web.xml
我花了幾天的時間來修復Spring項目中的錯誤。 長期以來,我在錯誤日志中的主要問題是:
Bean already exists
我有兩個文件:
WEB-INF/myproject-servlet.xml
WEB-INF/web.xml
在第一個中,我可以輸入以下內容(假設我有一個管理動物園動物的應用程序):
<context:component-scan base-package="com.my.package.animals" />
以此(據我所知),我們正在啟用Spring Bean自動發現。 所以現在,當我們運行應用程序時,Spring將從該程序包中獲取所有類,稍后它將遍歷resources
目錄中的所有配置文件並初始化所有bean(放置在與給定程序包相關聯的配置文件中)。
第二個web.xml
包含這樣的行
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myproject-servlet.xml</param-value>
</context-param>
我還可以將路徑放置到我的配置文件中,例如:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:animals-config.xml</param-value>
</context-param>
因此,現在,我在myproject-servlet.xml
具有“自動檢測”功能,並且在web.xml
針對相同對象的context-param
。
我的問題是,是否可能由此導致錯誤“ Bean已存在 ”? 我幾乎可以肯定的是,我檢查了所有bean的ID,並且沒有重復項。
所以我還有一個問題。 這樣做有什么好的方法? 創建新的配置文件時,應在哪里通知我的應用程序? 在myproject-servlet.xml
或web.xml
。 我真的需要清理我的應用程序,然后我將開始。
我檢查了一些示例,人們寧願不要在web.xml
文件中放置多個<context-param>
簡單示例
先感謝您
好吧,我真的很想解決我的問題。
假設我有兩個軟件包:
com.my.pckg.a
com.my.pckg.b
與類
com.my.pckg.a.ClassA
com.my.pckg.b.ClassB
我在以下行中添加了myproject-servlet.xml
:
<context:component-scan base-package="com.my.pckg.a" />
我有一個配置文件myconfig.xml
,里面有基於類ClassA和ClassB的 bean。
假設我們有ID如下所示的bean:
ClassA: ida1, ida2
ClassB: idb1, idb2
因此,我正在運行碼頭服務器,問題是:
哪些bean將被初始化? 我只聲明了com.my.pckg.a
包,因此從myconfig.xml
,spring應該只加載ida1
和ida2
但是此文件還包括另一個類的bean。
所以最后...?
最后,我想我發現了一個問題。 在web.xml
文件中,我有一行:
<context:component-scan base-package="com.dirty.pckg" />
在這個包中,我有一個帶有@Controller
注釋的DirtyClass
類。 此類的一個字段是:
private static ApplicationContext context = new ClassPathXmlApplicationContext("dirty-config.xml");
因此,當我的應用程序啟動時,Spring將獲取DirtyClass
(因為它具有@
)並進行映射。 因為os上下文的static
修飾符,它會觸發讀取dirty-config.xml
。 這樣我就無法理解為什么我的代碼表現得很奇怪。
web.xml
文件是Web應用程序的配置。 它與Spring無關。
contextConfigLocation
context-param是一個Spring偵聽器,用於搜索Spring配置文件。 與春天有關。
您可以在web.xml
注冊多個spring配置文件,但是這些文件不能定義相同的bean(bean id必須不同)。 您還只能擁有一個spring配置文件,該文件將自身包含其他配置文件,如下所述: http : //www.mkyong.com/spring/load-multiple-spring-bean-configuration-file/
回答另一個問題:
添加組件掃描后,您要求spring掃描com.my.pckg.a
程序包以com.my.pckg.a
@ Service,@ com.my.pckg.a
等注釋。...組件掃描不是其余配置的過濾器,而是一個配置本身。 因此,您添加組件掃描的事實將不會更改myconfig.xml的行為。 ida1,ida2和idb1,idb2都將被實例化。
我真的不了解您要使用配置文件來完成的工作。 也許如果您解釋您的需求,我們可以幫助您為您設置正確的配置。
web.xml是配置文件。 它具有應用程序的類(例如偵聽器,過濾器,過濾器映射,servlet,servlet映射),應用程序的資源和配置(例如上下文參數,diplayname,錯誤頁面,會話配置)以及網絡服務器如何使用它們來處理它們網絡請求。 當Web服務器收到對應用程序的請求時,它將使用web.xml將請求的URL映射到應該處理該請求的代碼。
談到web.xml中應包含的內容以及myproject-servlet.xml中應包含的內容:
1)在Spring中,ApplicationContext可以是分層的。 一個ApplicationContext可以有多個子ApplicationContext,並且只能有一個父。 子級ApplicationContext中的Bean可以訪問父級中的Bean。
2)DispatcherServlet使用可配置的處理程序映射,視圖分辨率配置(用於應用程序的哪種視圖模板,例如jsp)將請求調度到處理程序(控制器)。
牢記這兩點,我們的web.xml應該類似於:
<!--Root web application context(Parent context) - beans for service or persistence layer should be in this -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:service-layer-beans.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<!--DispatcherServlet loads its configuration into its own context(chile context) and refers Root web application context as a parent, so it have access to beans in parent context and can override it but not vice versa.-->
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/myproject-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.