Details
Description
When primefaces h:head renderer is used with inner f:facet (first\middle\last) like follows:
<h:head id="head"> <f:facet name="first"> <h:outputScript name="jquery.js"/> </f:facet> </h:head>
Application crashes with NPE during some AJAX requests on ComponentTagHandlerDelegate:337
ComponentSupport.removeFacet(ctx, parent, c, facetName);
This is caused by:
- ComponentTagHandlerDelegate:190 - Resolves facet name from non-relocated parent _HtmlHead (id="head")
- ComponentTagHandlerDelegate:327 - Changes parent to re-located element UIPanel(id="j_idhead_f_first")_, resolved with HtmlOutputScriptHandler
- ComponentTagHandlerDelegate:337 - Uses re-located parent with non-relocated parents facet name, facet isn't found, NPE is thrown.
Solution:
Refresh facetName when parent is changed, see diff:
--- a/myfaces-2.1.12/myfaces-impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentTagHandlerDelegate.java Wed Oct 08 15:18:20 2014 +0300 +++ b/myfaces-2.1.12/myfaces-impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/ComponentTagHandlerDelegate.java Wed Oct 08 15:18:33 2014 +0300 @@ -325,6 +325,7 @@ { // Replace parent with the relocated parent. parent = c.getParent(); + facetName = this.getFacetName(ctx, parent); // refresh facet name according to new parent } } if (facetName == null)
Note: Exception handling for such cases can be improved, as application crashes during render phase no response is rendered and MyFaces ExceptionHandler is unable to add exception into AJAX response - this way no exception is logged or returned, empty screen is rendered without any errors.