1

I'm working with JSF and templates. When I pass an invalid param on URL the part of the template for the menu gets java.lang.NullPointerException. It's not doing the validation of the <f:viewParam>. If I pass valid params all it's ok. It's rendering the other components of the template before doing the setters of the managed beans.

This happens when I added an h:link with f:param to page menu.xhtml or something similar.

URL that works OK :

http://localhost:8080/MiWebApp/maincontent/myWebPage.xhtml?myWebParam=aaa&myWebHeaderParam=bb

Url that no works:

http://localhost:8080/MiWebApp/maincontent/myWebPage.xhtml?myWebParam=aaa&myWebHeaderParam=zzzzzzzzzzzzz

This is an example of the web app:

template.xhtml

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/core">

    <f:view contentType="text/html" id="fview">

        <f:metadata>
            <ui:insert name="metadata" />
        </f:metadata>
        <h:head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
            <title>Page template with PrimeFaces</title>
            <ui:debug />
        </h:head>

        <h:body>
            <p:growl id="growl" life="3000" />

            <p:layout fullPage="true">
                <p:layoutUnit position="north" size="90" id="north" resizable="false"
                              style="min-width: 600px;"
                              styleClass="layoutHeader">
                    <ui:include src="header.xhtml" />
                </p:layoutUnit>

                <p:layoutUnit position="center" resizable="false">
                    <ui:insert name="content" />
                </p:layoutUnit>

                <p:layoutUnit position="east" id="west"         resizable="false"style="height:580px;overflow:hidden;min-width:200px;" >
                    <ui:include src="menu.xhtml" />
                </p:layoutUnit>
            </p:layout>
        </h:body>

    </f:view>
    </html>

header.xhtml

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
            xmlns:ui="http://java.sun.com/jsf/facelets"
            xmlns:h="http://java.sun.com/jsf/html"
            xmlns:p="http://primefaces.org/ui"
            xmlns:f="http://java.sun.com/jsf/core">

<h:panelGroup layout="block">
    <h:outputText value="myWebParam: #{myWebHeaderController.cp.myWebParam}"/>
    <h:outputText value="myWebHeaderParam #{myWebHeaderController.myWebHeaderParam}"/>
</h:panelGroup>

</ui:composition>

menu.xhtml

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:p="http://primefaces.org/ui"
                xmlns:f="http://java.sun.com/jsf/core">

    <h:panelGroup layout="block">
        <h:outputText value="myWebParam: #{myWebMenuController.cp.myWebParam}"/>
        <h:outputText value="myInput: #{myWebMenuController.myInput}"/>
    </h:panelGroup>
    <h:panelGroup layout="block">
        <h:link value="hey link"
                outcome="/maincontent/list/myWebPage">
            <f:param name="myWebParam" value="#{myWebMenuController.cp.myWebParam}"/>
            <f:param name="myWebHeaderParam" value="#{myWebHeaderController.myWebHeaderParam}"/>
        </h:link>
    </h:panelGroup>
</ui:composition>

myWebPage.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:h="http://java.sun.com/jsf/html"
                xmlns:p="http://primefaces.org/ui"
                xmlns:f="http://java.sun.com/jsf/core"
                template="/templates/template.xhtml">

    <ui:define name="metadata">
        <f:metadata>
            <f:viewParam id="myWebParam"
                         name="myWebParam"
                         required="true"
                         value="#{myWebCommonParamController.myWebParam}">
                <f:validateLength minimum="1"
                                  maximum="3"/>
                <f:validateRegex pattern="aaa"/>
            </f:viewParam>
            <f:viewParam id="myWebHeaderParam"
                         name="myWebHeaderParam"
                         required="true"
                         value="#{myWebHeaderController.myWebHeaderParam}">
                <f:validateLength minimum="1"
                                  maximum="2"/>
                <f:validateRegex pattern="bb"/>
            </f:viewParam>
        </f:metadata>
    </ui:define>

    <ui:define name="content">
        <f:view>
            <h:panelGroup layout="block">
                <h:outputText value="Hello, you are on myWebPage"/>
                <h:outputText value="myWebParam: #{myWebCommonParamController.myWebParam}"/>
                <h:outputText value="myWebHeaderParam: #{myWebHeaderController.myWebHeaderParam}"/>
            </h:panelGroup>
        </f:view>

    </ui:define>
</ui:composition>

Beans :

MyWebCommonParamController

@ManagedBean
@ViewScoped
public class MyWebCommonParamController {

    private String myWebParam;

    public MyWebCommonParamController() {
    }

    public String getMyWebParam() {
        return myWebParam;
    }

    public void setMyWebParam(String myWebParam) {
        this.myWebParam = myWebParam;
    }

}

MyWebHeaderController

@ManagedBean
@RequestScoped
public class MyWebHeaderController {

    @ManagedProperty(value = "#{myWebCommonParamController}")
    private MyWebCommonParamController cp;

    private String myWebHeaderParam;

    public MyWebHeaderController() {
    }

    public MyWebCommonParamController getCp() {
        return cp;
    }

    public void setCp(MyWebCommonParamController cp) {
        this.cp = cp;
    }

    public String getMyWebHeaderParam() {
        return myWebHeaderParam;
    }

    public void setMyWebHeaderParam(String myWebHeaderParam) {
        this.myWebHeaderParam = myWebHeaderParam;
    }

}

MyWebMenuController

@ManagedBean
@RequestScoped
public class MyWebMenuController {

    @ManagedProperty(value = "#{myWebCommonParamController}")
    private MyWebCommonParamController cp;
    private String myInput;

    public MyWebMenuController() {
    }

    public MyWebCommonParamController getCp() {
        return cp;
    }

    public void setCp(MyWebCommonParamController cp) {
        this.cp = cp;
    }

    public String getMyInput() {
        return myInput;
    }

    public void setMyInput(String myInput) {
        this.myInput = myInput;
    }

}

Console Error :

08:41:23,997 WARNING [javax.faces] (default task-1) Definiendo valor de atributo no serializable en ViewMap: (clave: myWebCommonParamController, clase de valor: com.mywebapp.MyWebCommonParamController)
08:41:28,879 WARNING [javax.faces] (default task-10) Definiendo valor de atributo no serializable en ViewMap: (clave: myWebCommonParamController, clase de valor: com.mywebapp.MyWebCommonParamController)
08:41:28,918 SEVERE [javax.enterprise.resource.webcontainer.jsf.application] (default task-10) Error Rendering View[/maincontent/myWebPage.xhtml]: java.lang.NullPointerException
    at java.net.URLEncoder.encode(URLEncoder.java:205) [rt.jar:1.7.0_72]
    at com.sun.faces.context.UrlBuilder.addValuesToParameter(UrlBuilder.java:318) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.context.UrlBuilder.addParameters(UrlBuilder.java:127) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.context.ExternalContextImpl.encodeBookmarkableURL(ExternalContextImpl.java:1045) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.application.view.MultiViewHandler.getBookmarkableURL(MultiViewHandler.java:407) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at javax.faces.application.ViewHandlerWrapper.getBookmarkableURL(ViewHandlerWrapper.java:272) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at org.jboss.weld.jsf.ConversationAwareViewHandler.getBookmarkableURL(ConversationAwareViewHandler.java:132) [weld-core-jsf-2.1.2.Final.jar:2014-01-09 09:23]
    at javax.faces.application.ViewHandlerWrapper.getBookmarkableURL(ViewHandlerWrapper.java:272) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.application.ViewHandlerWrapper.getBookmarkableURL(ViewHandlerWrapper.java:272) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at com.sun.faces.renderkit.html_basic.OutcomeTargetRenderer.getEncodedTargetURL(OutcomeTargetRenderer.java:194) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.renderkit.html_basic.OutcomeTargetLinkRenderer.renderAsActive(OutcomeTargetLinkRenderer.java:158) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.renderkit.html_basic.OutcomeTargetLinkRenderer.encodeBegin(OutcomeTargetLinkRenderer.java:96) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:864) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:302) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:115) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:79) [primefaces-5.1.jar:5.1]
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:66) [primefaces-5.1.jar:5.1]
    at org.primefaces.component.layout.LayoutUnitRenderer.encodeEnd(LayoutUnitRenderer.java:49) [primefaces-5.1.jar:5.1]
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1864) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1860) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1860) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1860) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:461) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) [shiro-web-1.2.1.jar:1.2.1]
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) [shiro-web-1.2.1.jar:1.2.1]
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) [shiro-core-1.2.1.jar:1.2.1]
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) [shiro-core-1.2.1.jar:1.2.1]
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) [shiro-core-1.2.1.jar:1.2.1]
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) [shiro-web-1.2.1.jar:1.2.1]
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) [shiro-web-1.2.1.jar:1.2.1]
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:177) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:727) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_72]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_72]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_72]

08:41:28,939 FATAL [javax.enterprise.resource.webcontainer.jsf.context] (default task-10) JSF1073: se ha interceptado java.lang.NullPointerException durante el procesamiento de RENDER_RESPONSE 6 : UIComponent-ClientId=, Mensaje=null
08:41:28,939 FATAL [javax.enterprise.resource.webcontainer.jsf.context] (default task-10) No associated message: java.lang.NullPointerException
    at java.net.URLEncoder.encode(URLEncoder.java:205) [rt.jar:1.7.0_72]
    at com.sun.faces.context.UrlBuilder.addValuesToParameter(UrlBuilder.java:318) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.context.UrlBuilder.addParameters(UrlBuilder.java:127) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.context.ExternalContextImpl.encodeBookmarkableURL(ExternalContextImpl.java:1045) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.application.view.MultiViewHandler.getBookmarkableURL(MultiViewHandler.java:407) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at javax.faces.application.ViewHandlerWrapper.getBookmarkableURL(ViewHandlerWrapper.java:272) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at org.jboss.weld.jsf.ConversationAwareViewHandler.getBookmarkableURL(ConversationAwareViewHandler.java:132) [weld-core-jsf-2.1.2.Final.jar:2014-01-09 09:23]
    at javax.faces.application.ViewHandlerWrapper.getBookmarkableURL(ViewHandlerWrapper.java:272) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.application.ViewHandlerWrapper.getBookmarkableURL(ViewHandlerWrapper.java:272) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at com.sun.faces.renderkit.html_basic.OutcomeTargetRenderer.getEncodedTargetURL(OutcomeTargetRenderer.java:194) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.renderkit.html_basic.OutcomeTargetLinkRenderer.renderAsActive(OutcomeTargetLinkRenderer.java:158) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.renderkit.html_basic.OutcomeTargetLinkRenderer.encodeBegin(OutcomeTargetLinkRenderer.java:96) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:864) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:302) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:115) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:79) [primefaces-5.1.jar:5.1]
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:66) [primefaces-5.1.jar:5.1]
    at org.primefaces.component.layout.LayoutUnitRenderer.encodeEnd(LayoutUnitRenderer.java:49) [primefaces-5.1.jar:5.1]
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1864) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1860) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1860) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1860) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:461) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) [jsf-impl-2.2.6-jbossorg-4.jar:]
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) [jboss-jsf-api_2.2_spec-2.2.6.jar:2.2.6]
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) [shiro-web-1.2.1.jar:1.2.1]
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) [shiro-web-1.2.1.jar:1.2.1]
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) [shiro-core-1.2.1.jar:1.2.1]
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) [shiro-core-1.2.1.jar:1.2.1]
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) [shiro-core-1.2.1.jar:1.2.1]
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) [shiro-web-1.2.1.jar:1.2.1]
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) [shiro-web-1.2.1.jar:1.2.1]
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146) [undertow-servlet-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:177) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:727) [undertow-core-1.0.15.Final.jar:1.0.15.Final]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_72]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_72]
    at java.lang.Thread.run(Thread.java:745) [rt.jar:1.7.0_72]
Tiny
  • 27,221
  • 105
  • 339
  • 599
xav56883728
  • 315
  • 1
  • 8
  • 20
  • possible duplicate of [What is a Null Pointer Exception, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it) – xlecoustillier Dec 19 '14 at 08:21
  • 3
    It's not a duplicate of this. Is an specific case of f:viewParam with templates. I know what is a null pointer exception, but in this case I don't know why it's happened and if I can use this with templates, or if exist the way that the bean receive the params before the other pages of the templates are rendered. – xav56883728 Dec 19 '14 at 08:30

2 Answers2

1

Some things I noticed:

  • to much and not needed id attributes. Careful with those, no need for id-ing f:viewParam or f:view

  • Since you did not include the import lines, I have to write both:

    • @javax.annotation.ManagedBean is for POJOs (Plain Old Java Objects, not for "controllers" (backing beans)

    • @javax.faces.bean.ManagedBean is deprecated and is from JSF 2.0 times. Now there is @Named and @javax.enterprise.context.SessionScoped and its siblings where you should really switch to.

Remember here that you must switch both annotations to "new" JSF 2.2 annotations, a combination of both versions (2.0/2.2) does not work!

Here is an incomplete but working example:

SomeContactSessionBean.java

@Named ("contactController")
@SessionScoped
public class SomeContactWebSessionBean implements Serializable {
    private static final long serialVersionUID = 9876543210;
}

And usage in e.g. test.xhtml

        <h:panelGroup styleClass="table_row" layout="block">
            <div class="table_left_medium">
                <h:outputLabel for="emailAddress" value="#{msg.ADMIN_PERSONAL_DATA_EMAIL_ADDRESS}" />
            </div>

            <div class="table_right_medium">
                <h:inputText styleClass="input" id="emailAddress" size="10" maxlength="255" value="#{contactController.emailAddress}" validatorMessage="#{msg.ENTERED_EMAIL_ADDRESS_IS_INVALID}">
                    <f:validator validatorId="EmailAddressValidator" />
                </h:inputText>
            </div>

            <div class="clear"></div>
        </h:panelGroup>

msg is my message bundle which is load in a central "master" template:

<f:loadBundle var="msg" basename="org.example.localization.bundle" />

Okay, that doesn't fully answer your question but may give you hints how to cleanup and upgrade your code a little bit ... :-)

Now, when I have links like http://some-host/jexample-war/faces/show_contact.xhtml?contactId=123

I go over a custom converter, but first I do this:

show_contact.xhtml

<ui:define name="metadata">
    <f:metadata>
        <f:viewParam name="contactId" value="#{beanHelper.contact}" converter="ContactConverter" required="true" requiredMessage="#{msg.ERROR_PARAMETER_CONTACT_ID_NOT_SET}" converterMessage="#{msg.PARAMETER_CONTACT_ID_INVALID}" />
        <f:viewAction onPostback="true" action="#{beanHelper.copyContactToController()}" />
    </f:metadata>
</ui:define>

SomeContactConverter.java:

@FacesConverter (value = "ContactConverter")
public class SomeContactConverter implements Converter {
    private static ContactSessionBeanRemote CONTACT_BEAN; // My EJB!
    public SomeContactConverter () {
    }
    @Override
    public Object getAsObject (final FacesContext context, final UIComponent component, final String submittedValue) {
        // Is the value null or empty?
        if ((null == submittedValue) || (submittedValue.trim().isEmpty())) {
            // Log message

            // Return null
            return null;
        }

        // Is the bean there?
        // @TODO Requires this synchronization or is it (sync) confusing the container?
        if (null == SomeContactConverter.CONTACT_BEAN) {
            // Try to get it
            try {
                // Get initial context
                Context initialContext = new InitialContext();

                // ... and user controller
                SomeContactConverter.CONTACT_BEAN = (ContactSessionBeanRemote) initialContext.lookup("java:global/jexample-ejb/contact!org.mxchange.jcontacts.contact.ContactSessionBeanRemote"); //NOI18N
            } catch (final NamingException ex) {
                // Continue to throw it
                throw new ConverterException(MessageFormat.format("initialContext.lookup() failed: {0}", ex.getMessage()), ex); //NOI18N
            }
        }

        // Init instance
        Contact contact = null;

        // Try to parse the value as long
        try {
            Long contactId = Long.valueOf(submittedValue);
        } catch (final NumberFormatException ex) {
            // Throw again
            throw new ConverterException(ex);
        } catch (final ContactNotFoundException ex) {
            // Log message ... Contact was not found, maybe show error message?
        }

        // Return it
        return contact;
    }

    @Override
    public String getAsString (final FacesContext context, final UIComponent component, final Object value) {
        // Is the object null?
        if ((null == value) || (String.valueOf(value).isEmpty())) {
            // Is null
            return ""; //NOI18N
        } else if (!(value instanceof Contact)) {
            // Not same interface
            throw new IllegalArgumentException(MessageFormat.format("value[]={0} does not implement Contact.", value.getClass().getSimpleName())); //NOI18N
        }

        // Return id number
        return String.valueOf(((Contact) value).getContactId());
    }

}

Please note that Contact and the remote interface are again custom interfaces and not part of JSF/EJB ... ;-)

Now you saw #beanHelper. That basically looks like:

SomeWebRequestHelperBean.java

@Named ("beanHelper")
@RequestScoped
public class SomeWebRequestHelperBean implements Serializable {

    /**
     * Serial number
     */
    private static final long serialVersionUID = 1234567890L;

    /**
     * Administrative contact controller
     */
    @Inject
    private SomeContactWebRequestController contactController;

    /**
     * Contact instance
     */
    private Contact contact;

    public void copyContactToController () {
        // Validate contact instance
        if (this.getContact() == null) {
            // Throw NPE
            throw new NullPointerException("this.contact is null"); //NOI18N
        } else if (this.getContact().getContactId() == null) {
            // Throw NPE again
            throw new NullPointerException("this.contact.contactId is null"); //NOI18N
        } else if (this.getContact().getContactId() < 1) {
            // Not valid
            throw new IllegalStateException(MessageFormat.format("this.contact.contactId={0} is not valid.", this.getContact().getContactId())); //NOI18N
        }

        // @deprecated Copy all fields to controller so it can be used in JSF tags as shown above
        // @TODO rewrite this to CDI event
        this.contactController.copyContactToController(this.getContact());
    }

    public Contact getContact () {
        return this.contact; // <f:viewParam> "triggers" to call this!
    }

    public void setContact (final Contact contact) {
        this.contact = contact; // <f:viewParam> "triggers" to call this!
    }
}

Please note, that this is incomplete but it should give you some hints what might be wrong.

Roland
  • 184
  • 1
  • 14
  • `this.contactController.copyContactToController` is already out-dated. ;-) I currently rewrite it to a CDI event . – Roland Aug 02 '17 at 21:07
  • I may deprecate `clear` CSS class, as there is the pseudo class `::after`. – Roland Aug 02 '17 at 21:23
  • 1
    OF being OpenFaces and not OmniFaces I presume – Kukeltje Aug 03 '17 at 06:55
  • I should then not shortcut! Thank you. `OmniFaces` it is. – Roland Aug 03 '17 at 22:17
  • 1
    Omnifaces and PrimeFaces are **not** rivals. See the Omnifaces showcase and what they used to develop it... Yes, PrimeFaces – Kukeltje Aug 03 '17 at 22:31
  • An other I just noticed is that the question starter seem to have setter/getter for "inserting" an other controller? Or what is `MyWebCommonParamController` ? If it is another `@Named` bean then you can simply use `@Inject` to inject it and maybe declare the class field `@Inject private MyWebCommonParamController commonParamController;`. Just another thing I noticed. – Roland Aug 04 '17 at 12:19
  • @xav56883728 could you please remove the many `id="foo"`? The `id` attribute is mostly for JSF's internal purposes to bind tags, except for a few things, like `h:outputLabel for="someId` and: `h:inputText id="someId"`. Remember: Use `id` only on a as-needed basis and not "over-id" your JSF application. – Roland Aug 20 '17 at 18:55
  • I no longer do this copy thing. It is deprecated on my side. – Roland Feb 19 '20 at 14:33
0

This is the normal behavior. The validation works but once the params are validated continue rendering the view and get the errors, but now you are using null values rendering the view.

Solutions:

  1. Initialize the beans with valid default values, load the page and show this errors.
  2. Send the user to an error page.
  3. Send the user to an error page with a custom message.

<o:viewParamValidationFailed> allows the developer to handle a view parameter validation failure with either a redirect or an HTTP error status, optionally with respectively a flash message or HTTP error message.

<f:metadata>
    <f:viewParam name="foo" converter="javax.faces.Long">
        <o:viewParamValidationFailed sendError="400" />
    </f:viewParam>
    <f:viewParam name="bar" converter="javax.faces.Long">
        <o:viewParamValidationFailed sendError="400" message="Invalid bar!"/>
    </f:viewParam>
    <f:viewParam name="baz" converter="javax.faces.Long">
        <o:viewParamValidationFailed sendRedirect="whatsnew" />
    </f:viewParam>
    <f:viewParam name="faz" converter="javax.faces.Long">
        <o:viewParamValidationFailed sendRedirect="whatsnew" message="Invalid faz!" />
    </f:viewParam>
    <f:viewParam name="boo" converter="javax.faces.Long" />
    <f:viewParam name="foz" converter="javax.faces.Long" />
    <o:viewParamValidationFailed sendError="400" message="#{foz.valid ? null : 'Invalid foz!'}" />
</f:metadata>

omnifaces viewParamValidationFailed

xav56883728
  • 315
  • 1
  • 8
  • 20