【问题标题】:Set Spring profile in Tomcat web app with no web.xml file在没有 web.xml 文件的 Tomcat Web 应用程序中设置 Spring 配置文件
【发布时间】:2017-06-08 00:15:14
【问题描述】:

我有一个 webapp,它是一个 RestEASY JAX-RS 应用程序,它使用最新的 servlet 规范,例如 Java EE 注释,因此我不需要创建 web.xml 文件。

webapp 捆绑为foobar.war 并转储到Tomcat 中的webapps 目录中。事实上,同一个 foobar.war 在同一个 Tomcat 实例中部署了两次,一次是 foobar.war,另一次是 foobar#demo.war(如您所知,它映射到 foobar/demo)。

我通过放置 conf/Catalina/localhost/foobar.xmlconf/Catalina/localhost/foobar#demo.xml 文件来配置每个已安装的 webapp,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Environment name="foo" type="java.lang.String" value="bar"/>
</Context>

在我的 JAX-RS 应用程序中,我使用 java:comp/env/foo 从 JNDI 中提取 foo 的值。

所以现在我添加了一个名为 FooBarConfiguration 的基于 Java 的 Spring 配置。我使用new AnnotationConfigApplicationContext(FooBarConfiguration.class) 将它加载到我的JAX-RS 应用程序中。一切正常。

所以现在我向FooBarConfiguration 添加了两个配置文件,一个名为foo,一个名为bar。但是现在......我如何告诉 webapp 使用哪个 Spring 配置文件? (记住我没有web.xml 文件。)显然我必须在某个地方设置spring.profiles.active。但是在哪里?

因为文档提到了“环境”和“JNDI”,所以我交叉手指向conf/Catalina/localhost/foobar.xml 添加了一个环境变量:

  <Environment name="spring.profiles.active" type="java.lang.String" value="foo"/>

运气不好。

我无法设置系统属性,因为这将适用于所有 webapps,这里的想法是每个foobar.war 实例(foobar.warfoobar#demo.war)都可以指定了不同的配置文件。

我想我可以自己手动将其从 Tomcat 环境中拉出,使用 java:comp/env/spring.profiles.active,但是我在哪里设置值? (我想也许AnnotationConfigApplicationContext 会有一个构造函数,我可以在其中设置配置文件,或者至少有一个配置文件设置,但这似乎也不见了。)

(另外,如果我手动从 JNDI 中提取设置并自己设置,我还不如切换到更轻量级的 Guice 并手动加载我想要的模块。我只使用庞大、笨重的 Spring,因为它承诺允许轻松选择配置文件。)

如何在我的 WAR 文件之外,在每个 webapp 的基础上指出我正在使用哪个 Spring 配置文件?

【问题讨论】:

    标签: java spring tomcat jax-rs spring-profiles


    【解决方案1】:

    您可以通过多种方式设置活动配置文件。由于您是通过 AnnotationConfigApplicationContext 构造函数搜索它,所以描述的 here in spring docs 可能适合您。

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.getEnvironment().setActiveProfiles("development");
    ctx.refresh();
    

    【讨论】:

    • 您描述的是一种有效的解决方法,但是您提供的链接使我了解了真正的解决方案:使用AnnotationConfigWebApplicationContext,它将使用 JNDI 自动获取配置文件,正如我想要的那样。感谢您的回复为我指明了解决方案,我已将其作为单独的答案给出。
    【解决方案2】:

    解决方案是使用AnnotationConfigWebApplicationContext 而不是StandardServletEnvironment

    诀窍是让 Spring 使用 StandardServletEnvironment,它在多个地方查找,包括 JNDI java:comp/env/... for spring.profiles.active。见http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-property-source-abstraction

    我的问题是AnnotationConfigApplicationContext 使用StandardEnvironment,它只在几个地方查找配置文件名称。切换到 AnnotationConfigWebApplicationContext 使 Spring 使用 StandardServletEnvironment

    final AnnotationConfigWebApplicationContext webContext =
        new AnnotationConfigWebApplicationContext();
    webContext.register(FooBarConfiguration.class);
    webContext.refresh();
    

    现在我在conf/Catalina/localhost/foobar.xml 中的 webapp 环境配置可以工作了:

    <?xml version="1.0" encoding="UTF-8"?>
    <Context>
      <Environment name="spring.profiles.active" type="java.lang.String" value="foo"/>
    </Context>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 2014-11-03
      • 2014-09-03
      • 2018-06-20
      相关资源
      最近更新 更多