我有一个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.xml
和conf/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.war
和foobar#demo.war
)每个都可以指定不同的个人资料。
我想我可以使用java:comp/env/spring.profiles.active
自己手动将它从Tomcat环境中拉出来,但是我在哪里设置值? (我想也许AnnotationConfigApplicationContext
会有一个构造函数,我可以在其中设置配置文件,或者至少有一个配置文件设置,但似乎也缺少。)
(另外如果我手动从JNDI中取出设置并自行设置,我也可以切换到更轻量级的Guice并手动加载我想要的模块。我只是使用了大量的,笨重的Spring,因为它承诺允许轻松选择配置文件。)
我如何在每个webapp的基础上指出我的WAR文件外部,我使用的是哪个Spring配置文件?
答案 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>