在Spring Boot中使用@Profile

9

我有一个Spring Boot应用程序(1.1.5.RELEASE),通过配置属性spring.profiles.active=MyProfile启用我的配置文件。

可以通过创建来自该配置文件的bean来正确激活配置文件。

然后我有一个如下使用的@Controller

@Controller
@RequestMapping("/someUrl")
@Profile("MyProfile")
public class MyController {
...
}

该控制器未被实例化,控制器中使用的URL未映射。在同一个包中,我有另一个控制器,这些控制器不受@Profile限制,并且可以按预期进行实例化和映射。

那么,在控制器上使用@Profile注释是否与Spring Boot不兼容?我应该使用其他方法吗?

编辑:看起来这确实是一个错误,因为如果我将-Dspring.profiles.active=MyProfile作为JVM属性包含,控制器就会被实例化:'(

编辑2:所以这里有趣的部分来了:

  • 如果你在默认从classpath加载的application.properties中定义spring.profiles.active,它可以工作

  • 当你将文件重命名为test.properties并通过@PropertySource("classpath:test.properties")包含它时,它停止工作。会对此提出一个bug。

编辑3:如承诺:https://github.com/spring-projects/spring-boot/issues/1417

谢谢!


对我来说,即使使用属性文件也完全没有问题! - geoand
1
为避免重复劳动,提醒您在此问题上已经开了一个 issue:https://github.com/spring-projects/spring-boot/issues/1417。谢谢。 - Andy Wilkinson
谢谢,好主意。已添加。 - Jan Zyka
2个回答

5

我认为这是Spring中的一个bug。详见SPR-12111


1
你肯定可以在Spring Boot中使用@Profile注解来注释控制器,就像你上面所做的那样。如果MyProfile处于活动状态,则会实例化MyController。你确定"MyProfile"是活动配置文件吗?你是否设置了spring.profiles属性?
@Profile注解可以以以下任何方式之一使用:
作为类型级别注释,直接或间接注释了@Component的任何类,包括@Configuration类 作为元注释,用于组合自定义构造型注释

你在哪里设置 spring.profiles.active - Jan Zyka
@JanZyka,我是在application.properties中设置的,没有尝试过使用不同的名称。有趣的。 - gyoder
如果您有空闲时间,可以将application.properties重命名为newName.properties,并在顶层的@Configuration文件中使用@PropertySource("newName.properties")吗? - Jan Zyka
@JanZyka,我按照你的建议去做了,结果就像你描述的那样出了问题。我甚至替换了application.properties文件并添加了spring.config.name=myotherproperties。另一个属性文件设置了服务器端口,所以我知道它被捡起来了。但是一旦我将spring.profiles和spring.profiles.active移动到其他属性文件中,它就停止工作了。 - gyoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接