1

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

bad_apples
  • 21
  • 6
  • What happens if you try `@FacesConverter(forClass= CatalogNodeWrapper.class)` and then remove the `converter=""` from the SelectOneMenu. try and let JSF auto discover how to convert it? – Melloware Aug 10 '21 at 12:53
  • @Melloware: I am getting the same error - Caused by: javax.el.PropertyNotFoundException: Target Unreachable, identifier 'catalogNodeWrapper' resolved to null. I have tried so many things but without succes. – bad_apples Aug 10 '21 at 20:09

0 Answers0