0

I am trying to implement my side navigation menu using Primefaces TreeNode. I was trying to use this example in my project, but with javax annotations instead of JSF.

Using Mojarra 2.2.12-jbossorg-2 with PrimeFaces 6.0

But when I run my application, I get the below exception

SEVERE [javax.enterprise.resource.webcontainer.jsf.application] (default task-8) Error Rendering View[/views/home.xhtml]: javax.el.ELException: /views/common/navigation/navigation-menu.xhtml @12,41 value="#{navTree.root}": java.lang.IllegalArgumentException: Cannot convert Menu of type class org.primefaces.model.DefaultTreeNode to interface org.primefaces.model.TreeNode

import java.io.Serializable;

import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

@Named("bcService")
@SessionScoped
public class BreadCrumbService implements Serializable {

    private static final long serialVersionUID = 1L;

    @SuppressWarnings("unused")
    public TreeNode createDocuments() {
        TreeNode root = new DefaultTreeNode(new Document("Menu", "root"), null);
        // Home
        TreeNode home = new DefaultTreeNode(new Document("Home", "home"), root);

        // Admin
        TreeNode admin = new DefaultTreeNode(new Document("Admin", "home"), home);
        TreeNode staff = new DefaultTreeNode("document", new Document("Staff", "home"), admin);
        TreeNode news = new DefaultTreeNode("document", new Document("News", "home"), admin);
        TreeNode availability = new DefaultTreeNode("document", new Document("Availability", "home"), admin);
        TreeNode printService = new DefaultTreeNode("document", new Document("PrintService", "home"), admin);
        TreeNode referenceDataCommon = new DefaultTreeNode("document", new Document("Reference Data Common", "home"), admin);

        // Billing
        TreeNode billing = new DefaultTreeNode(new Document("Billing", "home"), home);
        TreeNode initiateBilling = new DefaultTreeNode("document",new Document("Initiate Billing", "home"), billing);
        TreeNode billingMaintenance = new DefaultTreeNode("document",new Document("Billing Maintenance", "home"), billing);
        TreeNode viewBilling = new DefaultTreeNode("document", new Document("View Billing", "home"), billing);

        collapsingOrExpanding(home, true);
        return root;
    }

    public void collapsingOrExpanding(TreeNode n, boolean option) {
        if(n.getChildren().size() == 0) {
            n.setSelected(false);
        }
        else {
            for(TreeNode s: n.getChildren()) {
                collapsingOrExpanding(s, option);
            }
            n.setExpanded(option);
            n.setSelected(false);
        }
    }
}

Here is the NavigationTree

import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.model.TreeNode;

@Named("navTree")
@SessionScoped
public class NavigationTree implements Serializable {

    private static final long serialVersionUID = 1L;
    private TreeNode root;
    private TreeNode selectedNode;

    @Inject @Named("bcService")
    private BreadCrumbService service;

    @PostConstruct
    public void init() {
        root = service.createDocuments();
    }

    public void setService(BreadCrumbService service) {
        this.service = service;
    }

    public TreeNode getRoot() {
        return root;
    }

    public TreeNode getSelectedNode() {
        return selectedNode;
    }

    public void setSelectedNode(TreeNode selectedNode) {
        this.selectedNode = selectedNode;
    }
}

And the JSF view

<!DOCTYPE html 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:h="http://java.sun.com/jsf/html"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:c="http://java.sun.com/jstl/core"
 xmlns:p="http://primefaces.org/ui"
 xmlns:pe="http://primefaces.org/ui/extensions" xml:lang="en" lang="en">

 <h:form>
  <p:tree value="#{navTree.root}" var="doc" selectionMode="single" 
   selection="#{navTree.selectedNode}" >
   <p:treeNode expandedIcon="fa fa-folder-open"
    collapsedIcon="fa fa-folder">
    <h:outputText value="#{doc.name}" />
   </p:treeNode>
   <p:treeNode type="document" icon="fa fa-file-text-o fileColor">
    <h:outputText value="#{doc.name}" />
   </p:treeNode>
  </p:tree>
 </h:form>
</ui:composition>

Complete stack trace

14:36:15,311 SEVERE [javax.enterprise.resource.webcontainer.jsf.application] (default task-8) Error Rendering View[/views/home.xhtml]: javax.el.ELException: /views/common/navigation/navigation-menu.xhtml @12,41 value="#{navTree.root}": java.lang.IllegalArgumentException: Cannot convert Menu of type class org.primefaces.model.DefaultTreeNode to interface org.primefaces.model.TreeNode
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:114)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    at org.primefaces.component.api.UITree.getValue(UITree.java:157)
    at org.primefaces.component.tree.TreeRenderer.encodeMarkup(TreeRenderer.java:234)
    at org.primefaces.component.tree.TreeRenderer.encodeEnd(TreeRenderer.java:191)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:920)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:890)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1859)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:458)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:134)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    at org.apache.deltaspike.jsf.impl.listener.request.DeltaSpikeLifecycleWrapper.render(DeltaSpikeLifecycleWrapper.java:111)
    at javax.faces.lifecycle.LifecycleWrapper.render(LifecycleWrapper.java:92)
    at org.apache.deltaspike.jsf.impl.listener.request.JsfClientWindowAwareLifecycleWrapper.render(JsfClientWindowAwareLifecycleWrapper.java:160)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
    at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
    at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:285)
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:264)
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:175)
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:792)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javax.el.ELException: java.lang.IllegalArgumentException: Cannot convert Menu of type class org.primefaces.model.DefaultTreeNode to interface org.primefaces.model.TreeNode
    at com.sun.el.ExpressionFactoryImpl.coerceToType(ExpressionFactoryImpl.java:87)
    at javax.el.ELContext.convertToType(ELContext.java:473)
    at com.sun.el.lang.EvaluationContext.convertToType(EvaluationContext.java:166)
    at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:229)
    at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
    at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    ... 50 more
Caused by: java.lang.IllegalArgumentException: Cannot convert Menu of type class org.primefaces.model.DefaultTreeNode to interface org.primefaces.model.TreeNode
    at com.sun.el.lang.ELSupport.coerceToType(ELSupport.java:428)
    at com.sun.el.ExpressionFactoryImpl.coerceToType(ExpressionFactoryImpl.java:85)
    ... 56 more

I looked up the PrimeFaces 6.0 API and didn't see any reason why it would have an issue from DefaultTreeNode to TreeNode

I suspect the annotations, but not sure how to fix or what I am missing. Any help is appreciated.

Thanks, Avinash

Avinash Moram
  • 67
  • 2
  • 13
  • @BalusC looked at this [one](http://stackoverflow.com/questions/8660600/is-this-primefaces-bug-or-mojarra-myfaces-bug), but that is checkbox type – Avinash Moram Apr 18 '17 at 20:26
  • [This](http://stackoverflow.com/questions/8035877/cant-cast-to-implemented-interface) might help you. – David Florez Apr 18 '17 at 21:00
  • @David, I tried printing the version of class loader using `System.out.println("TreeNode Classloader Version"+TreeNode.class.getClassLoader().toString()); [TreeNode Classloader VersionModuleClassLoader for Module "deployment.myapp-ear.ear:main" from Service Module Loader]` but not sure how to print the same in the jsf page, let me post a new question for that. I am suspecting that my ear and web modules (I am using maven) are using two jars – Avinash Moram Apr 19 '17 at 15:13
  • @David, thanks. There were two primefaces jars, one in ejb module and one is war module. Once I am able to print version in the web module `TreeNode Classloader VersionModuleClassLoader for Module "deployment.paris-ear.ear.paris-web-1.0.war:main" from Service Module Loader ` and according to [this](http://stackoverflow.com/questions/13050640/cast-error-with-addcallbackparam-in-primefaces) I removed the dependency from my ejb module. Please post your comment as answer so that I can accept it. – Avinash Moram Apr 19 '17 at 18:48
  • glad to hear that it helped. I left the answer. – David Florez Apr 19 '17 at 19:07

1 Answers1

0

As suggested in the comments of the question, The error is happening because you have two different class loaders loading the same class, here are the posts that helped to fix the problem

Community
  • 1
  • 1
David Florez
  • 1,460
  • 2
  • 13
  • 26