Error on browser refresh

Hi,

We have updated our application from 7.0 to 7.1 (7.2 has too much impact due to our customized login screen) and now see this error appearing whenever we refresh the browser (F5) independent of the screen or location we do so.

Internal Server Error.
Please contact system administrator.
Try again later. Click here to continue.

Development information:

[!] You can disable development information using: cuba.web.productionMode application property.
Exception Name: javax.servlet.ServletException
Exception Message: com.vaadin.server.ServiceException: java.lang.NullPointerException
Exception stack trace:
    javax.servlet.ServletException: com.vaadin.server.ServiceException: java.lang.NullPointerException
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:427)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
	at com.haulmont.addon.saml.web.security.saml.SamlLoginHttpRequestFilter.doFilter(SamlLoginHttpRequestFilter.java:110)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:93)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
Caused by: com.vaadin.server.ServiceException: java.lang.NullPointerException
	at com.vaadin.server.VaadinService.handleExceptionDuringRequest(VaadinService.java:1629)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1589)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425)
	... 32 more
Caused by: java.lang.NullPointerException
	at com.haulmont.cuba.web.sys.navigation.UrlChangeHandler.restoreState(UrlChangeHandler.java:173) ~[cuba-web-7.1.8.jar:7.1.8]
	at com.haulmont.cuba.web.AppUI.refresh(AppUI.java:517) ~[cuba-web-7.1.8.jar:7.1.8]
	at com.vaadin.ui.UI.doRefresh(UI.java:829) ~[vaadin-server-8.6.4-30-cuba.jar:8.6.4-30-cuba]
	at com.vaadin.server.communication.UIInitHandler.reinitUI(UIInitHandler.java:260) ~[vaadin-server-8.6.4-30-cuba.jar:8.6.4-30-cuba]
	at com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:162) ~[vaadin-server-8.6.4-30-cuba.jar:8.6.4-30-cuba]
	at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:67) ~[vaadin-server-8.6.4-30-cuba.jar:8.6.4-30-cuba]
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) ~[vaadin-server-8.6.4-30-cuba.jar:8.6.4-30-cuba]
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1577) ~[vaadin-server-8.6.4-30-cuba.jar:8.6.4-30-cuba]
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425) ~[vaadin-server-8.6.4-30-cuba.jar:8.6.4-30-cuba]
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329) ~[cuba-web-7.1.8.jar:7.1.8]
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215) ~[cuba-web-7.1.8.jar:7.1.8]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) ~[servlet-api.jar:na]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[catalina.jar:9.0.14]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.14]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-websocket.jar:9.0.14]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:9.0.14]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.14]
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108) ~[spring-web-5.1.13.RELEASE.jar:5.1.13.RELEASE]
	at com.haulmont.addon.saml.web.security.saml.SamlLoginHttpRequestFilter.doFilter(SamlLoginHttpRequestFilter.java:110) ~[saml-addon-web-0.3.1.jar:na]
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113) ~[spring-web-5.1.13.RELEASE.jar:5.1.13.RELEASE]
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74) ~[spring-web-5.1.13.RELEASE.jar:5.1.13.RELEASE]
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:93) ~[cuba-web-7.1.8.jar:7.1.8]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[catalina.jar:9.0.14]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[catalina.jar:9.0.14]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[catalina.jar:9.0.14]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ~[catalina.jar:9.0.14]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) ~[catalina.jar:9.0.14]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) ~[catalina.jar:9.0.14]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[catalina.jar:9.0.14]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:668) ~[catalina.jar:9.0.14]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[catalina.jar:9.0.14]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[catalina.jar:9.0.14]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) ~[tomcat-coyote.jar:9.0.14]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) ~[tomcat-coyote.jar:9.0.14]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834) ~[tomcat-coyote.jar:9.0.14]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1417) ~[tomcat-coyote.jar:9.0.14]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-coyote.jar:9.0.14]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_221]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_221]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-util.jar:9.0.14]
	at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_221]

We have done some investigation and somehow the topLevelWindow returns a null object on line 171 of the UrlChangeHandler.class. We are unable to find out why this happens.

Some relevant info (perhaps):

  • We have a customized login as well as main window:
    cuba.web.loginScreenId = loginWindow
    cuba.web.mainScreenId = mainWindow
  • We do not use screen routing (yet), the cuba.web.urlHandlingMode is set to NONE
  • We do have a custom link handler (back from release 6)

Any suggestions where to look for the cause of this error? Any help appreciated!

Regards,
-b

Hi,

Any news on this? It appears to be a bigger problem than just the refresh; if we are forwarded through the SAML SSO the same error appears.

Any help much appreciated!

Regards,
-b

Hi,

this problem is fixed in CUBA 7.2.7 (see GitHub issue).

Because in CUBA 7.1 UrlChangeHandler isn’t a bean yet, you can’t easily override it to provide the same fix in your app. But, you can override AppUI and don’t call urlChangeHandler.restoreState() at all. In order to do this:

  1. Create CustomAppUI and override the refresh(VaadinRequest) method:
public class CustomAppUI extends AppUI {

    private static final Logger log = LoggerFactory.getLogger(CustomAppUI.class);

    @Override
    protected void refresh(VaadinRequest request) {
        // CAUTION: copied from super
        boolean sessionIsAlive = true;

        Connection connection = app.getConnection();

        if (connection.isAuthenticated()) {
            // Ping middleware session if connected
            log.debug("Ping middleware session");

            try {
                UserSession session = connection.getSession();
                if (session instanceof ClientUserSession
                        && ((ClientUserSession) session).isAuthenticated()) {
                    userSessionService.getUserSession(session.getId());

                    if (hasAuthenticatedSession()
                            && !Objects.equals(userSession, session)) {
                        setUserSession(session);
                    }
                }
            } catch (Exception e) {
                sessionIsAlive = false;

                app.getExceptionHandlers().handle(new com.vaadin.server.ErrorEvent(e));
            }

            if (sessionIsAlive) {
                events.publish(new SessionHeartbeatEvent(app));
            }
        }

        // Call 'restoreState' only if UrlHandlingMode is URL_ROUTES
        if (UrlHandlingMode.URL_ROUTES == webConfig.getUrlHandlingMode()) {
            urlChangeHandler.restoreState();
        }

        if (sessionIsAlive) {
            events.publish(new UIRefreshEvent(this));
        }
    }
}
  1. Register CustomAppUI in web-spring.xml:
<bean id="cuba_AppUI"
      class="com.company.demo.web.CustomAppUI"
      scope="prototype"/>

Demo project that demonstrates the workaround: demo71.zip (84.3 KB)

Regards,
Gleb

1 Like

Hi Gleb,

You saved my day - works like a charm! Really couldn’t have fixed this on my own.

I searched for this to be a known issue but I couldn’t find anything, glad that it is a known issue and fixed already. We will continue to migrate to 7.2+ a.s.a.p. as well.

Regards,
-b