java.lang.NoSuchMethodError: javax.faces.component.UIComponent.getPassThroughAttributes(Z)Ljava/util/Map; after migrating to JSF 2.2
java.lang.NoSuchMethodError: javax.faces.component.UIComponent.getPassThroughAttributes(Z)Ljava/util/Map; after migrating to JSF 2.2
迁移到 JSF 2.2 后出现以下异常。具体来说,我正在将 Mojarra 2.1.17 升级到 Mojarra 2.2.8。
java.lang.NoSuchMethodError: javax.faces.component.UIComponent.getPassThroughAttributes(Z)Ljava/util/Map;
at org.primefaces.renderkit.RendererUtils.renderPassThroughAttributes(RendererUtils.java:79)
at org.primefaces.renderkit.CoreRenderer.renderDynamicPassThruAttributes(CoreRenderer.java:119)
at org.primefaces.renderkit.CoreRenderer.renderPassThruAttributes(CoreRenderer.java:114)
at org.primefaces.renderkit.BodyRenderer.encodeBegin(BodyRenderer.java:44)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:823)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1611)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:399)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:273)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
当我检查 jsf-api-2.2.8.jar
里面的 UIComponent
时,我可以看到有一个方法 Map<String, Object> getPassThroughAttributes(boolean create);
.
这是怎么造成的,我该如何解决?
该方法在 JSF 2.2 中是 introduced。当 webapp 的运行时类路径被多个不同版本的 JSF API 库污染时,就会发生此问题。换句话说,您在运行时类路径中的某处仍然是 JSF 2.0 或 2.1 API。
这表明您正在尝试通过手动将 JSF 捆绑在 webapp 中并将其部署到已经捆绑了 JSF 的 Java EE 容器来升级 JSF,例如 WildFly,JBoss AS、GlassFish、WebLogic、WebSphere 等。您的堆栈跟踪太短,无法确认,但您的问题历史记录确认您正在使用 WebLogic。
为了在 WebLogic 中正确升级 Mojarra,您实际上应该替换 /wlserver/modules
文件夹中的 JSF JAR。
如果您实际上使用的是未捆绑开箱即用的 JSF 的准系统 servletcontainer,例如 Tomcat,那么您需要验证是否 /WEB-INF/lib
(或 pom 文件在 Maven 的情况下)在 JSF API 中没有重复项。最常见的初学者错误是那里也有 javaee-api.jar
。这应该被删除(或设置为 provided
)。另见 a.o。 How do I import the javax.servlet API in my Eclipse project?
迁移到 JSF 2.2 后出现以下异常。具体来说,我正在将 Mojarra 2.1.17 升级到 Mojarra 2.2.8。
java.lang.NoSuchMethodError: javax.faces.component.UIComponent.getPassThroughAttributes(Z)Ljava/util/Map;
at org.primefaces.renderkit.RendererUtils.renderPassThroughAttributes(RendererUtils.java:79)
at org.primefaces.renderkit.CoreRenderer.renderDynamicPassThruAttributes(CoreRenderer.java:119)
at org.primefaces.renderkit.CoreRenderer.renderPassThruAttributes(CoreRenderer.java:114)
at org.primefaces.renderkit.BodyRenderer.encodeBegin(BodyRenderer.java:44)
at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:823)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1611)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:399)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:273)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
当我检查 jsf-api-2.2.8.jar
里面的 UIComponent
时,我可以看到有一个方法 Map<String, Object> getPassThroughAttributes(boolean create);
.
这是怎么造成的,我该如何解决?
该方法在 JSF 2.2 中是 introduced。当 webapp 的运行时类路径被多个不同版本的 JSF API 库污染时,就会发生此问题。换句话说,您在运行时类路径中的某处仍然是 JSF 2.0 或 2.1 API。
这表明您正在尝试通过手动将 JSF 捆绑在 webapp 中并将其部署到已经捆绑了 JSF 的 Java EE 容器来升级 JSF,例如 WildFly,JBoss AS、GlassFish、WebLogic、WebSphere 等。您的堆栈跟踪太短,无法确认,但您的问题历史记录确认您正在使用 WebLogic。
为了在 WebLogic 中正确升级 Mojarra,您实际上应该替换 /wlserver/modules
文件夹中的 JSF JAR。
如果您实际上使用的是未捆绑开箱即用的 JSF 的准系统 servletcontainer,例如 Tomcat,那么您需要验证是否 /WEB-INF/lib
(或 pom 文件在 Maven 的情况下)在 JSF API 中没有重复项。最常见的初学者错误是那里也有 javaee-api.jar
。这应该被删除(或设置为 provided
)。另见 a.o。 How do I import the javax.servlet API in my Eclipse project?