Search code examples
jsf-2maven-3classloadertreenode

Primefaces DefaultTreeNode to TreeNode conversion issue


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


Solution

  • 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