I just recently added togglz to the spring-boot 3.1.9 application, which contains also much stuff like spring-security, spring-data, etc.
Maven dependency:
<dependency>
<groupId>org.togglz</groupId>
<artifactId>togglz-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>
Feature enum:
import org.togglz.core.Feature;
public enum ApplicationFeatures implements Feature {
MY_FEATURE
}
Configuration:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.togglz.core.manager.EnumBasedFeatureProvider;
import org.togglz.core.spi.FeatureProvider;
import org.togglz.core.user.NoOpUserProvider;
import org.togglz.core.user.UserProvider;
@Configuration
public class TogglesConfiguration {
@Bean
public FeatureProvider featureProvider() {
return new EnumBasedFeatureProvider(ApplicationFeatures.class);
}
@Bean
public UserProvider userProvider() {
return new NoOpUserProvider();
}
}
Application.yaml:
togglz:
features:
MY_FEATURE:
enabled: true
Simple service that uses:
import de.telekom.wom.workorder.config.toggles.ApplicationFeatures;
import org.springframework.stereotype.Service;
@Service
public class MyService {
public String getA() {
if (ApplicationFeatures.MY_FEATURE.isActive())
return "OK";
else
return "INACTIVE";
}
}
Simple spring boot test:
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest//(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class Testik {
@Autowired
MyService myService;
@Test
void name() {
myService.getA();
}
}
The problem is that if I don't start real web environment, so use simple @SpringBootTest
wihtout (webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
, I am getting an error:
java.lang.IllegalStateException: Could not find the FeatureManager. For web applications please verify that the TogglzFilter starts up correctly. In other deployment scenarios you will typically have to implement a FeatureManagerProvider as described in the 'Advanced Configuration' chapter of the documentation.
Although if I create a sample project, it works as expected. Where could the problem be? Why the rise of the web environment can affect Togglz?
Logs by success:
DEBUG [FeatureContext.findFeatureManagerInClassLoader()] Provider org.togglz.core.context.BeanFinderFeatureManagerProvider returned FeatureManager
Logs by error:
DEBUG [FeatureContext.findFeatureManagerInClassLoader()] No FeatureManager provided by org.togglz.core.context.BeanFinderFeatureManagerProvider
UPDATE: I just realized that if I remove the actuator dependency from the pom.xml file, then everything works as it should. Any ideas why?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Here is a link to an issue on Github: