javax.faces.FacesException: java.lang.LinkageError解决办法

本文解决了一个关于MyFaces应用中出现的EL-API版本冲突问题,详细介绍了如何定位问题所在及最终解决方案。
javax.faces.FacesException: java.lang.LinkageError: loader constraints violated when linking javax/el/ExpressionFactory class  
    org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:425)  
    org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)  
    org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:108)  
    org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:216)  
    org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:41)  
    org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:132)  
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)  
    org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:141)  
    org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:281) 
错误的原因是tomcat/lib下的el-api.jar与项目WEB-INF/lib目录下的el-api.jar冲突。把项目目录下的el-api.jar删除即可。
你遇到的错误: ``` javax.faces.FacesException: Unsupported tree node type: ZX-PDA_145-56 ``` 通常出现在使用 PrimeFaces 的树组件(`<p:tree>`)时,传入的 `TreeNode` 类型不被支持或未正确初始化。 --- ### ✅ 错误原因分析 1. **自定义 TreeNode 类型未正确注册或使用** PrimeFaces 默认使用 `DefaultTreeNode`。如果你使用了自定义的 `TreeNode` 子类(例如 `GenericTreeNode<T>`),但未正确配置或未实现必要的构造方法,就会抛出此异常。 2. **节点类型字符串未正确指定或拼写错误** 在创建 `TreeNode` 时传入的 `type` 参数(如 `"ZX-PDA_145-56"`)如果没有被前端组件识别,也可能导致此异常。 3. **未实现默认构造方法** JSF 和 PrimeFaces 框架在反序列化或创建节点时,可能需要调用默认构造方法(无参构造方法),如果没有提供,也会报错。 --- ### ✅ 解决方案 #### ✅ 1. 确保你的自定义节点继承并实现正确构造方法 ```java import org.primefaces.model.DefaultTreeNode; import org.primefaces.model.TreeNode; public class GenericTreeNode<T> extends DefaultTreeNode { public GenericTreeNode() { super(); } public GenericTreeNode(String type, T data, TreeNode parent) { super(type, data, parent); } public GenericTreeNode(String type, T data) { this(type, data, null); } @Override public T getData() { return (T) super.getData(); } } ``` #### ✅ 2. 确保创建节点时使用正确的类型字符串 ```java TreeNode root = new GenericTreeNode<>("root", "Root Node"); TreeNode child = new GenericTreeNode<>("ZX-PDA_145-56", new MyData("Test")); root.getChildren().add(child); ``` 如果你在前端使用了特定的节点类型渲染器(如图标、样式),确保这些类型是前端组件支持的,或者你自己实现了对应的渲染逻辑。 #### ✅ 3. 检查前端 `<p:tree>` 是否支持该节点类型 例如: ```xhtml <p:tree value="#{treeBean.root}" var="node"> <p:treeNode type="ZX-PDA_145-56" icon="pi pi-file"> <h:outputText value="#{node.name}" /> </p:treeNode> <p:treeNode> <h:outputText value="#{node}" /> </p:treeNode> </p:tree> ``` 确保你在 `<p:treeNode>` 中正确声明了 `type="ZX-PDA_145-56"`,否则会找不到匹配的渲染器。 --- ### ✅ 小结 | 问题 | 解决方法 | |------|----------| | 不支持的树节点类型 | 使用 `DefaultTreeNode` 或正确继承实现 | | 缺少默认构造方法 | 添加无参构造函数 | | 前端未声明节点类型 | 在 `<p:treeNode>` 中添加 `type` 属性 | | 类型字符串拼写错误 | 检查并统一前后端的类型字符串 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值