无法部署含PrimeFaces的WAR文件至WebSphere问题咨询
解决WebSphere 8.5.5部署含PrimeFaces的JSF应用时的NoSuchMethodError问题
这个错误java.lang.NoSuchMethodError: javax/faces/component/UIComponent.getPassThroughAttrib...本质是运行时使用的JSF版本过低导致的——getPassThroughAttributes()是JSF 2.2才新增的方法,而WebSphere 8.5.5默认自带的是JSF 2.0版本。当你的应用启用了依赖JSF 2.2+的PrimeFaces 6.0,但容器优先加载了自带的旧版JSF API时,就会出现这个找不到方法的错误。
下面是具体的解决步骤:
1. 修改应用的类加载顺序为Parent Last
WebSphere默认采用Parent First类加载策略(先加载容器自带的类,再加载应用打包的类),这会导致自带的JSF 2.0覆盖你WAR包中MyFaces 2.2.13的类。我们需要把该应用的类加载顺序改成Parent Last:
- 登录WebSphere管理控制台,找到你部署的应用
- 进入应用的配置页面,找到「类加载和更新检测」选项
- 将「类加载顺序」设置为类加载器先加载应用程序类,然后再加载父类加载器的类(对应Parent Last)
- 保存配置后重启应用
2. 添加ibm-web-ext.xml禁用容器冲突特性
如果修改类加载顺序后还是有问题,可以在WAR包的WEB-INF目录下创建ibm-web-ext.xml文件,明确禁用WebSphere自带的JSF相关特性,强制使用应用打包的MyFaces:
<?xml version="1.0" encoding="UTF-8"?> <web-ext xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-web-ext_1_0.xsd" version="1.0"> <!-- 禁用与应用冲突的容器特性(比如自带的JSF) --> <disable-conflicting-container-features>true</disable-conflicting-container-features> </web-ext>
3. 确认依赖包的完整性与兼容性
- 确保你的WAR包
lib目录中只有MyFaces 2.2.13的API和Impl包,没有混入其他版本的JSF相关JAR(比如Mojarra的包) - PrimeFaces 6.0和MyFaces 2.2.x是兼容的,这部分不需要调整
完成以上步骤后,重新部署应用,应该就能解决这个方法找不到的错误了。
内容的提问来源于stack exchange,提问作者user3612488
相关产品推荐
相关产品推荐

