【问题标题】:Define context param from web.xml and web-fragment.xml separately分别从 web.xml 和 web-fragment.xml 定义上下文参数
【发布时间】:2017-09-30 21:12:07
【问题描述】:

我有一个使用多个 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,它在自己的META-INF 文件夹下包含一个web-fragment.xml(不同于主应用程序的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

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

有没有办法让 Spring 在这两个位置寻找上下文?或者在 web.xmlweb-fragment.xml 中分别定义上下文的方法?

【问题讨论】:

    标签: spring web.xml tomcat8 web-fragment


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这是我的 50 美分。

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-06-15
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        • 1970-01-01
        相关资源
        最近更新 更多