我正在尝试将Togglz集成到Spring应用程序中。由于Togglz自动配置没有成功(没有创建FeatureManager bean,因此也没有创建ApplicationContext ),所以定义了Togglz:
@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问题是,当我开始测试时,这个特性总是被禁用的。通过调试,我发现应用程序在target/test-classes/conf/features.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自动配置某些东西,我无法理解问题在哪里。
提前谢谢。
发布于 2022-07-13 03:50:14
我遇到了类似的问题,因为当我期望FeatureOptions.MY_FEATURE_1.isActive()为true时,它总是返回false。
因此,我的设置基本上是遵循快速启动指南,我做了一些小的调整。多亏了dzone文章的帮助,我才让它开始工作。似乎缺少的是将特性提供程序注入spring中。这意味着如果我有一个SpringConfiguration.java,我需要添加以下代码:
@Bean
@SuppressWarnings("unchecked")
public FeatureProvider featureProvider() {
return new EnumBasedFeatureProvider(FeatureOptions.class);
}添加此代码后,用于检查标志isActive()的代码将按预期返回(true)
我注意到这篇文章是2018年发布的,所以我的回答没有多大帮助。也许最好让Togglz站点将这个添加到他们的指南中。
请注意,如果您依赖于初学者提供的自动配置,那么您似乎可以跳过这些配置,并跳过注册FeatureProvider bean。见官方指南这里。
干杯
https://stackoverflow.com/questions/48829027
复制相似问题