Togglz выдает ошибку IllegalStateException

Я продолжаю получать IllegalStateException: не удалось найти FeatureManager при установке togglz в веб-приложении на Maven. Я точно следовал инструкциям. В моем приложении maven у меня есть следующие настройки в моем файле pom.xml:

<dependency>
<groupId>org.togglz</groupId>
<artifactId>togglz-core</artifactId>
<version>2.1.0.Final</version>
</dependency>

<dependency>
<groupId>org.togglz</groupId>
<artifactId>togglz-console</artifactId>
<version>2.1.0.Final</version>
</dependency>

<dependency>
<groupId>org.togglz</groupId>
<artifactId>togglz-servlet</artifactId>
<version>2.1.0.Final</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>

А также следующее в файле web.xml:

<context-param>
<param-name>org.togglz.core.manager.TogglzConfig</param-name>
<param-value>com.test.test.ana.FeatureFlagConfiguration</param-value>
</context-param>

<servlet>
<servlet-name>TogglzConsoleServlet</servlet-name>
<servlet-class>org.togglz.console.TogglzConsoleServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>TogglzConsoleServlet</servlet-name>
<url-pattern>/togglz/*</url-pattern>
</servlet-mapping>

Это примерное приложение maven работает нормально, но когда я пытаюсь перейти в виртуальный каталог togglz, оно выдает IllegalStateException: не удалось найти ошибку FeatureManager, оно не дает гораздо более подробной информации, чем это. Любые предложения относительно того, что на самом деле означает эта ошибка? Я просто пытаюсь получить пример проекта, который использует togglz, который работает. Я не могу использовать весну или CDI, только сервлеты. (да, у меня настроен сервлет 3.0)

Заранее спасибо,

Изменить: Вот точный след стека:

    [ERROR   ] SRVE0777E: Exception thrown by application class 'org.togglz.core.context.FeatureContext.getFeatureManager:49'
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.
    at org.togglz.core.context.FeatureContext.getFeatureManager(FeatureContext.java:49)
    at org.togglz.core.manager.LazyResolvingFeatureManager.getDelegate(LazyResolvingFeatureManager.java:24)
    at org.togglz.core.manager.LazyResolvingFeatureManager.getCurrentFeatureUser(LazyResolvingFeatureManager.java:49)
    at org.togglz.console.TogglzConsoleServlet.isFeatureAdmin(TogglzConsoleServlet.java:68)
    at org.togglz.console.TogglzConsoleServlet.service(TogglzConsoleServlet.java:55)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1285)
    at [internal classes]

1 ответ

Если вы находитесь в простой среде сервлетов, вам нужно будет сделать следующие вещи после добавления зависимостей Maven:

Реализуйте свою функцию enum

Это обычно выглядит так:

public enum MyFeatures implements Feature {

    @EnabledByDefault
    @Label("First Feature")
    FEATURE_ONE,

    @Label("Second Feature")
    FEATURE_TWO;

    public boolean isActive() {
        return FeatureContext.getFeatureManager().isActive(this);
    }

}

Настройте Togglz, внедрив TogglzConfig

Типичный пример выглядит так:

public class MyTogglzConfiguration implements TogglzConfig {

    public Class<? extends Feature> getFeatureClass() {
        return MyFeatures.class;
    }

    public StateRepository getStateRepository() {
        return new FileBasedStateRepository(new File("/tmp/features.properties"));
    }

    public UserProvider getUserProvider() {
        return new ServletUserProvider();
    }

}

Зарегистрируйте свой класс конфигурации в web.xml

В простой среде сервлетов вам теперь нужно зарегистрировать свою реализацию TogglzConfig, добавив что-то вроде этого в ваш web.xml:

<context-param>
  <param-name>org.togglz.core.manager.TogglzConfig</param-name>
  <param-value>com.example.myapp.MyTogglzConfiguration</param-value>
</context-param>

Вы также должны явно указать Togglz, что вы не хотите, чтобы он просматривал FeatureManager из Spring или CDI, а создал сам экземпляр и управлял им:

<context-param>
  <param-name>org.togglz.FEATURE_MANAGER_PROVIDED</param-name>
  <param-value>true</param-value>
</context-param>

В средах Servlet 3.0 TogglzFilter обычно выбирается автоматически. Однако вы также можете зарегистрировать его вручную:

<filter>
  <filter-name>TogglzFilter</filter-name>
  <filter-class>org.togglz.servlet.TogglzFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>TogglzFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

Я надеюсь, что это поможет. Если это все еще не работает, пожалуйста, включите полную трассировку стека в ваш вопрос.

Другие вопросы по тегам