【问题标题】:Togglz is throwing an IllegalStateException errorTogglz 抛出 IllegalStateException 错误
【发布时间】:2015-05-20 20:57:03
【问题描述】:

我不断收到 IllegalStateException:在 maven 上的 Web 应用程序中安装 togglz 时找不到 FeatureManager。我已经完全按照说明进行了。在我的 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 的示例项目。我不能使用 spring 或 cdi,只能使用 servlet。 (是的,我配置了 servlet 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]

【问题讨论】:

    标签: java maven web-applications togglz


    【解决方案1】:

    如果你在一个普通的Servlet环境中,在添加Maven依赖之后你需要做以下事情:

    实现您的功能枚举

    这通常看起来像这样:

    public enum MyFeatures implements Feature {
    
        @EnabledByDefault
        @Label("First Feature")
        FEATURE_ONE,
    
        @Label("Second Feature")
        FEATURE_TWO;
    
        public boolean isActive() {
            return FeatureContext.getFeatureManager().isActive(this);
        }
    
    }
    

    通过实现 TogglzConfig 配置 Togglz

    一个典型的例子是这样的:

    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 中注册你的配置类

    在一个普通的 Servlet 环境中,您现在必须通过在 web.xml 中添加类似这样的内容来注册您的 TogglzConfig 实现:

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

    您还应该明确告诉 Togglz 您不希望它从 Spring 或 CDI 中查找 FeatureManager,而是自己创建和管理实例:

    <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>
    

    我希望这会有所帮助。如果这仍然不起作用,请在您的问题中包含完整的堆栈跟踪。

    【讨论】:

    • 我已经完成了一切,直到最后一个 context-param 部分,但是一旦我添加了我仍然得到错误。我会把它添加到问题中
    • 我认为 TogglzFilter 似乎没有被自动拾取。您能否按照此处所述将过滤器添加到您的 web.xml:togglz.org/documentation/installation.html
    猜你喜欢
    • 1970-01-01
    • 2019-06-10
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多