我有一个使用多个网络片段的主要webapp项目。它运行在Tomcat 8上。
在我的 web.xml 文件中,我引用了主要的Spring上下文,如:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:META-INF/spring/mainCtx.xml
</param-value>
</context-param>
在WEB-INF/lib
文件夹中,我有componentA.jar
在其自己的META-INF
文件夹下包含 web-fragment.xml (与主应用程序不同&# 39; s META-INF
文件夹):
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:META-INF/spring/componentA_Ctx.xml
</param-value>
</context-param>
然而,似乎Spring无法在jar中找到我的compomentA_Ctx.xml。在进一步阅读时,似乎因为在2个上下文文件中存在名称冲突contextConfigLocation
。
我的目标是赋予组件可插拔性,使其独立于主Web应用程序。因此,我想分别加载其上下文。
有没有让Spring在两个位置查找上下文?或者在 web.xml 和 web-fragment.xml 中单独定义上下文的方法?
答案 0 :(得分:0)
我遇到了类似的问题,在web.xml中定义了两个上下文,web-fragment.xml不起作用。我通过在邮件上下文中导入componentA_Ctx.xml来管理,如下所示。
<import resource="classpath*:/META-INF/yourpath/componentA_Ctx.xml"/>
上面的配置仍然像一个可插拔的东西。即使在类路径中没有这样的文件,主要上下文的加载也不会失败。
答案 1 :(得分:0)
这是我的50美分。
我遇到了类似的问题:需要保持主产品(WAR)的清洁,并且可以通过类路径(JAR)中的自定义依赖项来扩展/替换其应用程序上下文。
WebInitializer当时不是一个选项,正如您已经注意到的那样,无法在 web.xml 中使用 contextConfigLocation 和/ em> web-fragment.xml 同时。
将自定义JAR资源导入主产品上下文可能是一个选项,但您需要为名称和路径定义非常明确的规则,因此它不是那么干净。
长话短说,我已经使用spring default applicationContext来实现我想要的目标:
web.xml 没有 contextConfigLocation ,但Web项目中有 WEB-INF / applicationContext.xml 。因此,主要产品干净,工作正常。
web-fragment.xml 可以设置为以下选项:
2.1。 替换applicationContext:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:META-INF/spring/custom-AppContext.xml</param-value>
</context-param>
2.2。 补充applicationContext:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/applicationContext.xml classpath:META-INF/spring/custom-AppContext.xml</param-value>
</context-param>
请注意,对于我的情况(自定义),需要补充并与主要产品共享相同的 applicationContext 。
最后,这将适用于单个自定义JAR(我的业务案例:每个客户端一个自定义jar),但是如果你有更多&#34; jar组件&#34;并且需要坚持使用xml,使用&#34; classpath *&#34; 导入资源,并为名称添加一些规则可能是唯一的选择。