在Tomcat Web应用程序中设置Spring配置文件,不包含web.xml文件

时间:2017-06-08 00:15:15

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

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

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

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

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

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

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

现在我已经向FooBarConfiguration添加了两个配置文件,一个名为foo,另一个名为bar。但是现在......我怎么告诉webapp使用哪个Spring配置文件? (请记住,我没有web.xml文件。)显然我必须在某处设置spring.profiles.active。但在哪里?

因为文档中提到了&#34; environment&#34;和&#34; JNDI&#34;,我用手指向conf/Catalina/localhost/foobar.xml添加了一个环境变量:

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

没有运气。

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

解决方案是使用AnnotationConfigWebApplicationContext代替StandardServletEnvironment

诀窍是让Spring使用StandardServletEnvironment,它会查看几个地方,包括JNDI java:comp/env/... 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>