分别从web.xml和web-fragment.xml定义上下文参数

时间:2017-05-03 07:01:11

标签: spring web.xml tomcat8 web-fragment

我有一个使用多个网络片段的主要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 中单独定义上下文的方法?

2 个答案:

答案 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来实现我想要的目标:

  1. web.xml 没有 contextConfigLocation ,但Web项目中有 WEB-INF / applicationContext.xml 。因此,主要产品干净,工作正常。

  2. web-fragment.xml 可以设置为以下选项:

  3. 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; 导入资源,并为名称添加一些规则可能是唯一的选择。