2016-03-22 5 views
1

Ich versuche, eine UI-Komponente zu erstellen, mit der der Benutzer das Timeout von Sitzungen anpassen kann. Also habe ich ein Servlet als unten:java.lang.IllegalStateException: ServletConfig wurde nicht initialisiert

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); 
    } 

} 

Allerdings, wenn ich dies auf Glassfish bereitstellen, ich unten Exception.

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) 

habe ich getServletConfig() vor getServletContext() verwendet, aber es war null. Warum sind meine Konfiguration und mein Kontext nicht richtig eingestellt?

+0

Verwenden Sie nicht '@ PostConstruct', sondern überschreiben Sie stattdessen die' init'-Methode. Dies wird zu früh im Lebenszyklus aufgerufen (nach der Konstruktion, aber bevor der Container eine Änderung des Aufrufs der 'init (ServletConfig)' hatte), ist also immer noch 'null'. –

Antwort

2

Servlets predigen verwaltete Beans und Annotationen und all die fantastischen Dinge, die Sie seit Java EE 6 sehen. Zuvor müssen Sie explizit eine vordefinierte abstrakte/Template-Methode implementieren, um eine Aufgabe zu einem bestimmten Zeitpunkt im Lebenszyklus auszuführen.

Für Servlets müssen Sie die vordefinierte GenericServlet#init()-Methode überschreiben, um die Initialisierung auf dieselbe Weise wie bei für eine "normale" verwaltete Bean zu aktivieren.

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

Die getServletContext() wird dort verfügbar sein. Wenn Sie auf die GenericServlet Javadoc achten, werden Sie feststellen, dass es auch eine gibt. Es wird jedoch dringend empfohlen, die Methode nicht zu verwenden, sondern stattdessen init() zu verwenden. Die Standardimplementierung von sorgt nämlich dafür, dass der ServletContext richtig eingestellt ist. Sie müssen sich kümmern super.init(config) anrufen, um nicht den gleichen Fehler zu machen. Beachten Sie als historische Anmerkung, dass der kanonische Name einer -Methode, wie Sie sie auf verwalteten Beans sehen, "init", von genau dieser Servlet-API übernommen wird.

Falls Sie sich wundern, das @PreDestroy entspricht der GenericServlet#destroy() Methode.

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