java.lang.IllegalStateException:ServletConfig尚未初始化

用户名

我正在尝试创建一个UI组件,该组件允许用户自定义会话超时。因此,我创建了一个servlet,如下所示:

public class SessionTimeoutServlet extends AbstractBaseServlet {
    private static final long serialVersionUID = 2567293974465204729L;

    public static final String REQUEST_TIMEOUT_PARAMETR_NAME = "timeout";
    private static final String TIMEOUT_TYPE_INIT_PARAMETER_NAME = "timeoutType";
    private static final String WEB_TYPE_TIMEOUT = "web";
    private static final String WEBSERVICE_TYPE_TIMEOUT = "webService";

    @EJB(mappedName = SessionSettingsRemote.BEAN_NAME)
    private SessionSettingsRemote sessionSettingsBean;

    @PostConstruct
    public void initTimeout() {
        try {
            String timeoutType = getServletContext().getInitParameter(TIMEOUT_TYPE_INIT_PARAMETER_NAME);
            if (WEBSERVICE_TYPE_TIMEOUT.equals(timeoutType)) {
                setCustomTimeout(sessionSettingsBean.getSessionSettingsDTO().getWebServiceSessionTimeoutInterval());
            } else if (WEB_TYPE_TIMEOUT.equals(timeoutType)) {
                setCustomTimeout(sessionSettingsBean.getSessionSettingsDTO().getWebSessionTimeoutInterval());
            } else {
                setCustomTimeout(30);
            }
        } catch (ApplicationException e) {
            setCustomTimeout(30);
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int timeout = Integer.parseInt(request.getParameter(REQUEST_TIMEOUT_PARAMETR_NAME));
        setCustomTimeout(timeout);
    }

    public static void setCustomTimeout(int customTimeout) {
        SessionManagerListener.setCustomTimeout(customTimeout);
    }

}

但是,当我在GlassFish上部署它时,出现下面的异常。

Caused by: java.lang.IllegalStateException: ServletConfig has not been initialized
    at javax.servlet.GenericServlet.getServletContext(GenericServlet.java:199)
    at com.accedian.ems.uiapplication.server.servlets.SessionTimeoutServlet.initTimeout(SessionTimeoutServlet.java:33)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl$3.run(InjectionManagerImpl.java:766)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.invokeLifecycleMethod(InjectionManagerImpl.java:760)
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:531)
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:141)
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:127)
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.createManagedObject(InjectionManagerImpl.java:347)
    at com.sun.enterprise.web.WebContainer.createServletInstance(WebContainer.java:991)
    at com.sun.enterprise.web.WebModule.createServletInstance(WebModule.java:2130)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1404)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1381)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5732)

我以前用过getServletConfig()getServletContext()以前用过null那么,为什么我的配置和上下文设置不正确?

BalusC

Servlet早于自Java EE 6以来您所看到的托管Bean和批注以及所有奇特的东西。以前,您必须显式实现预定义的abstract / template方法,以便在生命周期中的某个时刻执行任务。

对于servlet,为了以与@PostConstruct在“普通”托管Bean上使用的相同方式挂钩其初始化,必须重写预定义的GenericServlet#init()方法。

@Override
public void init() {
    // ...
}

getServletContext()那里可用。

如果您注意GenericServletjavadoc,您会注意到还有一个init(ServletConfig)但是,强烈建议不要使用该方法,而应init()改用。的默认实现init(ServletConfig)即确保ServletContext正确设置。您必须介意super.init(config)不要犯同样的错误。作为历史记录,请注意,@PostConstruct在托管Bean上看到方法的规范名称“ init”是完全从此Servlet API继承的。

如果您想知道,@PreDestroy等效GenericServlet#destroy()方法就是。

@Override
public void destroy() {
    // ...
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

原因:java.lang.IllegalStateException:ParsePlugins已经初始化

java.lang.IllegalStateException:BeanFactory未初始化或已经关闭-在通过ApplicationContext访问bean之前调用'refresh'

java.lang.NoClassDefFoundError:无法初始化类java.awt.Toolkit

java.lang.NoClassDefFoundError:无法初始化类XXX

VM初始化期间发生错误(java / lang / NoClassDefFoundError:java / lang / Object)

java.lang.IllegalStateException:FragmentManager尚未附加到主机

Java,如何避免“可能尚未初始化”

java.lang.IllegalStateException:com.example.bottomnav此过程中未初始化默认FirebaseApp

引起原因:java.lang.IllegalStateException:尚未连接GoogleApiClient

如何关闭“ java:变量可能尚未初始化”

春季:java.lang.NoClassDefFoundError:无法初始化类

java.lang.IllegalStateException:无法初始化上下文,因为已经存在根应用程序上下文

java.lang.IllegalStateException:无法初始化插件:MockMaker

Java错误“变量可能尚未初始化”

java.lang.IllegalStateException:CameraX尚未初始化

java变量范围,变量可能尚未初始化

VM初始化期间发生错误:java.lang.UnsatisfiedLinkError:java.lang.Class.desiredAssertionStatus0(Ljava / lang / Class;)

线程“主”中的异常java.lang.Error:未解决的编译问题:本地变量xxx可能尚未初始化

ResultInfo-java.lang.IllegalStateException:尚未连接GoogleApiClient

Java:变量的捕获异常可能尚未初始化

java.lang.IllegalStateException:无法初始化 GAE 后台线程工厂

Spring Boot - java.lang.IllegalStateException:ApplicationEventMulticaster 未初始化

java.lang.IllegalStateException:任务尚未完成

java.lang.IllegalStateException:此过程中未初始化默认 FirebaseApp

将项目导出到 jar 时出现“java.lang.IllegalStateException:工具包未初始化”

Java.Lang.IllegalStateException 默认 FirebaseApp 未初始化

Java 错误:变量 playerClass 可能尚未初始化

變量尚未在 Java 中初始化

java.lang.IllegalStateException:ServletConfig 尚未在测试中初始化