3

我有一个使用多个 web 片段的主要 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包含一个web-fragment.xmlMETA-INF的文件夹(不同于主应用程序的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。进一步阅读后,似乎是因为contextConfigLocation2 个上下文文件中存在名称冲突。

我的目标是为组件提供可插入性,使其独立于主 webapp。因此我想单独加载它的上下文。

无论如何让Spring在这两个位置寻找上下文?或者一种在web.xmlweb-fragment.xml中分别定义上下文的方法?

4

2 回答 2

0

我遇到了类似的问题,在 web.xml 和 web-fragment.xml 中定义两个上下文不起作用。我通过在邮件上下文中导入 componentA_Ctx.xml 进行管理,如下所示。

 <import resource="classpath*:/META-INF/yourpath/componentA_Ctx.xml"/>

上面的配置还是像一个可插拔的东西。即使类路径中没有这样的文件,主上下文的加载也不会失败。

于 2017-12-14T23:41:18.703 回答
0

这是我的 50 美分。

我有一个类似的问题:需要保持主要产品(WAR)的清洁,并有可能通过类路径(JAR)中的自定义依赖项来扩展/替换其应用程序上下文。

WebInitializer当时不是一个选项,正如您已经注意到的那样,不可能同时在web.xmlweb-fragment.xml中使用contextConfigLocation

将自定义 JAR 资源导入主要产品上下文可能是一种选择,但您需要为名称和路径定义非常明确的规则,因此它不是那么干净。

长话短说,我利用spring默认的applicationContext来实现我想要的:

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

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

2.1。替换应用上下文:

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:META-INF/spring/custom-AppContext.xml</param-value>
  </context-param>

2.2. 补充应用上下文:

  <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),但如果您有更多“jar 组件”并且需要坚持使用 xml,则使用“classpath*”导入资源并添加一些名称规则可能是唯一的选择。

于 2018-03-14T15:09:33.040 回答