Vaadin CDI not existing UI - HTTP 500

Hi,

I created an application with Vaadin CDI and when I requesting the context path (eg.: http://localhost:8080/myApp/UI) then the UI class starts and load the defined default view as excepted.

The problem is that when I request a not existing UI (eg: http://localhost:8080/myApp/invalid)
I get a NPE but I expecting an HTTP 404 error.
The NPE is the following:

[code]
17:47:37,350 SEVERE [com.vaadin.server.DefaultErrorHandler]
(http-localhost/127.0.0.1:8080-2) : java.lang.NullPointerException
at com.vaadin.navigator.Navigator.navigateTo(Navigator.java:503) [vaadin-server-7.3.8.jar:7.3.8]

at com.vaadin.ui.UI.doInit(UI.java:646) [vaadin-server-7.3.8.jar:7.3.8]

at com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:217) [vaadin-server-7.3.8.jar:7.3.8]

at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:74) [vaadin-server-7.3.8.jar:7.3.8]

at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) [vaadin-server-7.3.8.jar:7.3.8]

at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1406) [vaadin-server-7.3.8.jar:7.3.8]

at com.vaadin.cdi.server.VaadinCDIServletService.handleRequest(VaadinCDIServletService.java:92) [vaadin-cdi-1.0.2.jar:1.0.2]

at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:305) [vaadin-server-7.3.8.jar:7.3.8]

at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-1.jar:1.0.2.Final-redhat-1]

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.4.2.Final-redhat-2.jar:7.4.2.Final-redhat-2]

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:926) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_71]

17:47:37,357 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web]
.[default-host]
.
[/myApp].[com.sample.myApp.UIApplicationServlet]
] (http-localhost/127.0.0.1:8080-2) JBWEB000236: Servlet.service() for servlet com.sample.myApp.UIApplicationServlet threw exception: java.lang.NullPointerException
at com.vaadin.navigator.Navigator.navigateTo(Navigator.java:503) [vaadin-server-7.3.8.jar:7.3.8]

at com.vaadin.ui.UI.doInit(UI.java:646) [vaadin-server-7.3.8.jar:7.3.8]

at com.vaadin.server.communication.UIInitHandler.getBrowserDetailsUI(UIInitHandler.java:217) [vaadin-server-7.3.8.jar:7.3.8]

at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:74) [vaadin-server-7.3.8.jar:7.3.8]

at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41) [vaadin-server-7.3.8.jar:7.3.8]

at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1406) [vaadin-server-7.3.8.jar:7.3.8]

at com.vaadin.cdi.server.VaadinCDIServletService.handleRequest(VaadinCDIServletService.java:92) [vaadin-cdi-1.0.2.jar:1.0.2]

at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:305) [vaadin-server-7.3.8.jar:7.3.8]

at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.2.Final-redhat-1.jar:1.0.2.Final-redhat-1]

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:231) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.4.2.Final-redhat-2.jar:7.4.2.Final-redhat-2]

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:926) [jbossweb-7.4.9.Final-redhat-1.jar:7.4.9.Final-redhat-1]

at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_71]

[/code]The com.sample.myApp.UIApplicationServlet is defined as a simple CDI servlet:

[code]
package com.sample.myApp;

import javax.servlet.annotation.WebServlet;

import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.cdi.server.VaadinCDIServlet;

@WebServlet(
value = “/*”
,asyncSupported = true
)
@VaadinServletConfiguration(
productionMode = false
,ui = MainUI.class
)
public class UIApplicationServlet extends VaadinCDIServlet{

}
[/code]When I remove the custom UIApplicationServlet then HTTP 404 returned for invalid URIs.

Diferences when the app is deployed is these:
When no custom servlet defined:

[com.vaadin.cdi.internal.ContextDeployer] (ServerService Thread Pool -- 55) Registering VaadinServlet with CDIUIProvider [com.vaadin.cdi.internal.ContextDeployer] (ServerService Thread Pool -- 55) Mapping VaadinServlet to /* When custom servlet defined:

[com.vaadin.cdi.internal.ContextDeployer] (ServerService Thread Pool -- 55) Vaadin related servlet is defined in deployment descriptor, automated deployment of VaadinCDIServlet is now disabled How can I set up the custom Vaadin CDI servlet to give me an HTTP 404 if a not existing UI is referenced in the request?

(I am using Jboss EAP 6.3.2, JDK 1.7.0_71, Vaadin 7.3.8, Vaadin CDI 1.0.2)

17742.zip (3.62 KB)

Hi,

I have found that the @VaadinServletConfiguration cause this behaviour:
the default ui is mandatory for this annotation and this cause that requesting for a not
existent UI this default UI is provided by com.vaadin.server.DefaultUIProvider
but this class know nothing about CDI and the initialization for the @CDIUI is not proper
that is why the Navigator throws a NPE.

I think that when VaadinCDIServlet used a CDI aware DefaultUIProvider should be used
and it should be registered by the VaadinCDIServletService like CDIUIProvider registered.