我正在尝试将 Togglz 集成到 Spring Boot Web 应用程序中。由于我没有成功使用 Togglz 自动配置(没有FeatureManager
创建 bean,因此ApplicationContext
没有创建 bean),我定义了 Togglz bean:
@Configuration
@EnableAutoConfiguration
public class TooglzAppCtxtConfig {
@Bean
public StateRepository stateRepository() throws IOException {
// Retrieve the configuration directory as Spring Resource...
Resource confDir = Application.getConfDir();
Resource applicationProperties = confDir
.createRelative("features.properties");
return new FileBasedStateRepository(applicationProperties.getFile());
}
@Bean
public UserProvider userProvider() {
return new NoOpUserProvider();
}
@Bean
public FeatureManager manager() throws IOException {
return new FeatureManagerBuilder()
.featureEnum(MyEnumFeatures.class)
.stateRepository(this.stateRepository())
.userProvider(this.userProvider()).build();
}
其中MyEnumFeatures
枚举是:
public enum MyEnumFeatures implements Feature {
@Label("Authorization Key")
AUTHORIZATION_KEY;
public boolean isActive() {
return FeatureContext.getFeatureManager().isActive(this);
}
}
我的pom.xml
包含:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.togglz</groupId>
<artifactId>togglz-console</artifactId>
</dependency>
<dependency>
<groupId>org.togglz</groupId>
<artifactId>togglz-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.togglz</groupId>
<artifactId>togglz-testing</artifactId>
<version>2.5.0.Final</version>
<scope>test</scope>
</dependency>
该文件features.properties
(位于我的配置目录中)包含以下行(语法取自此处):
AUTHORIZATION_KEY=true
问题是当我开始测试时,该功能总是被禁用。通过调试,我发现应用程序加载了一个feature.properties
文件,target/test-classes/conf/features.properties
其中包含:
#Fri Feb 16 14:01:15 CET 2018
AUTHORIZATION_KEY=false
这似乎是自动生成的。因此,该功能始终处于禁用状态。false
在执行每个测试用例之前,将使用设置为的功能重新生成文件。
此外,我试图修改我的测试引入愚蠢@Rule
:
@Rule
public TogglzRule togglzRule = TogglzRule.allEnabled(MyFeatures.class);
并在每个测试用例开始时启用/禁用该功能:
@Test
public void isavail_fileExists_Y() throws Exception {
togglzRule.enable(MyFeatures.AUTHORIZATION_KEY);
this.mockMvc.perform(get("/isavail?f=QCNjZWkvVGVzdC5wZGYjQA"))
.andDo(print()).andExpect(status().isOk())
.andExpect(content().string(containsString("Y")));
}
同样,该功能始终被禁用。
我哪里错了?我需要帮助。
我想解释一下流程中涉及哪些bean以及如何配置它们。我在这里找到的示例有效,但不清楚原因:SpringBoot 自动配置某些东西,我无法理解问题出在哪里。
提前致谢。