I am currently trying to make a stylish dropdown item with the help of p:selectOneMenu. I am working on it because I am trying to migrate a project to Primefaces 10. The project was implemented more than 10 years ago. For this reason there is no CDI. The server used is an IBM WebSphere Liberty v21 (feature jsf-2.3 was deployed).
The xhtml part look like this:
<p:selectOneMenu id="techSpecsOneMenuId"
value="#{techSpecsTreeMBean.selectedCatalogNodeWrapper}"
var="catalogNodeWrapper" styleClass="techSpecsOneMenuClass"
converter="catalogNodeWrapperConverter">
<f:selectItems value="#{techSpecsTreeMBean.catalogNodes}"
var="catNode"
itemLabel="#{catNode.positionName}" itemValue="#{catNode}" />
<p:column>
<h:panelGroup layout="block" styleClass="fieldLabelSmall">
<ui:repeat value="#{catalogNodeWrapper.levelList}" var="level">
<h:graphicImage
value="resources/images/treetable/tree_line_blank.gif"
alt="treeLineBlank" style="vertical-align: middle;" />
</ui:repeat>
<h:graphicImage value="#{catalogNodeWrapper.positionIcon}"
style="vertical-align: top;" alt="posIcon"
rendered="#{catalogNodeWrapper.specificationNode.nodeType != 'OVERVIEW'}" />
<h:commandLink
action="#{catalogNodeWrapper.techNodeDropDownSelectedAction}"
value="#{catalogNodeWrapper.positionName}"
title="#{catalogNodeWrapper.positionTitle}"
style="vertical-align: middle;"
rendered="#{catalogNodeWrapper.specificationNode.nodeType != 'OVERVIEW'}" />
<h:outputText value="#{catalogNodeWrapper.positionName}"
rendered="#{catalogNodeWrapper.specificationNode.nodeType == 'OVERVIEW'}"
style="vertical-align: middle;" />
</h:panelGroup>
</p:column>
</p:selectOneMenu>
TechSpecsTreeMBean is a managed bean:
<managed-bean>
<managed-bean-name>techSpecsTreeMBean</managed-bean-name>
<managed-bean-class>....TechSpecsTreeMBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
CatalogNodeWrapper is just a Java-Bean:
public class CatalogNodeWrapper implements Serializable, Comparable<CatalogNodeWrapper>
And finally the CatalogNodeWrapperConverter is a "normal" JSF-Converter:
@FacesConverter(value = "catalogNodeWrapperConverter")
public class CatalogNodeWrapperConverter implements Converter<CatalogNodeWrapper> {
private static final Logger LOGGER = Logger.getLogger(CatalogNodeWrapperConverter.class.getName());
@Override
public CatalogNodeWrapper getAsObject(FacesContext arg0, UIComponent arg1, String arg2) throws ConverterException {
LOGGER.log(LapLevel.INFO, "CatalogNodeWrapperConverter.getAsObject");
TechSpecsTreeMBean tempTechSpecsTreeMBean =
(TechSpecsTreeMBean) MBeanUtil.getManagedBeanByElResolver(MBeanControllerInit.TECHSPECSTREE_CONTROLLER);
if (arg2 != null && arg2.trim().length() > 0) {
try {
return tempTechSpecsTreeMBean.getCatalogNodesMap().get(Integer.parseInt(arg2));
}
catch (NumberFormatException e) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid catalogNode."));
}
} else {
return null;
}
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, CatalogNodeWrapper arg2) throws ConverterException {
LOGGER.log(LapLevel.INFO, "CatalogNodeWrapperConverter.getAsString");
if (arg2 != null) {
return String.valueOf(arg2.getId());
} else {
return "";
}
}
}
For me everything looks fine, but I am getting the following error:
Caused by: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'catalogNodeWrapper' resolved to null
at org.apache.el.parser.AstValue.getTarget(AstValue.java:72)
at org.apache.el.parser.AstValue.invoke(AstValue.java:226)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
at org.apache.myfaces.view.facelets.el.ContextAwareTagMethodExpression.invoke(ContextAwareTagMethodExpression.java:96)
... 79 more
Same error is thrown if I register the converter in the faces-config.xml
<converter>
<converter-id>catalogNodeWrapperConverter</converter-id>
<converter-class>....CatalogNodeWrapperConverter</converter-class>
</converter>
If I am using the CDI Feature I have to change the annotation of the converter to:
@Named
@FacesConverter(value = "countryConverter", managed = true)
and the usage of the converter to:
converter="#{catalogNodeWrapperConverter}"
the following error is thrown:
javax.el.ELException: Cannot convert 24 of type class java.lang.String to class ....CatalogNodeWrapper
at org.apache.el.lang.ELSupport.coerceToType(ELSupport.java:658)
at org.apache.el.parser.AstValue.setValue(AstValue.java:201)
at org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:257)
at org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.setValue(ContextAwareTagValueExpression.java:146)
at javax.faces.component.UIInput.updateModel(UIInput.java:429)
at javax.faces.component.UIInput.processUpdates(UIInput.java:347)
It seems that the converter is not used.
Any idea or solution will be highly appreciated.
And I have already checked tis guide - Identifying and solving javax.el.PropertyNotFoundException: Target Unreachable