当前位置: 首页 > 知识库问答 >
问题:

WebSphere8上的JSF Mojarra 2.2。十、

李奕
2023-03-14

多年来,我们一直在WebSphere7和WebSphere8上运行JSF1.2应用程序。我们使用捆绑在其中的JSF构建war,并始终将类加载器设置为最后一个父类。

现在已经升级到JSF 2.2(以及RF4和PF4,直到迁移完成),我们现在面临着在同一台服务器(WAS 8.0和WAS 8.5)上部署的问题。

我们现在已经完成了类似的方法(捆绑JSF和PARENT LAST类加载)。应用程序确实启动了,它提到了Mojarra 2.2.11的初始化,但在第一页请求中,我们会收到以下错误:

java.lang.reflect.UndeclaredThrowableException
 at com.sun.proxy.$Proxy34.markResourceRendered(Unknown Source)
 at org.richfaces.resource.ResourceFactoryImpl.createMappedResource(ResourceFactoryImpl.java:366)
 at org.richfaces.resource.ResourceFactoryImpl.createResource(ResourceFactoryImpl.java:343)
 at org.richfaces.resource.ResourceHandlerImpl.createResource(ResourceHandlerImpl.java:266)
 at javax.faces.application.ResourceHandlerWrapper.createResource(ResourceHandlerWrapper.java:137)
 at org.apache.myfaces.custom.captcha.CAPTCHAResourceHandlerWrapper.createResource(CAPTCHAResourceHandlerWrapper.java:83)
 at org.apache.myfaces.tomahawk.resource.UncompressedResourceHandlerWrapper.createResource(UncompressedResourceHandlerWrapper.java:109)
 at org.apache.myfaces.tomahawk.resource.UncompressedResourceHandlerWrapper.createResource(UncompressedResourceHandlerWrapper.java:61)
 at com.sun.faces.renderkit.html_basic.ScriptRenderer.encodeEnd(ScriptRenderer.java:104)
 at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
 at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863)
 Caused by: java.lang.reflect.InvocationTargetException
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
 at java.lang.reflect.Method.invoke(Method.java:611)
 at org.richfaces.application.ServiceTracker$1.invoke(ServiceTracker.java:153)
 ... 52 more
 Caused by: java.lang.ExceptionInInitializerError
 at org.richfaces.resource.external.ResourceTrackerForMyFaces.<init>(ResourceTrackerForMyFaces.java:58)
 at org.richfaces.resource.external.ResourceTrackerImpl.getImplementation(ResourceTrackerImpl.java:86)
 at org.richfaces.resource.external.ResourceTrackerImpl.markResourceRendered(ResourceTrackerImpl.java:67)
 ... 57 more
 Caused by: java.lang.NoSuchMethodException: org.apache.myfaces.shared_impl.renderkit.html.util.ResourceUtils.isRenderedStylesheet(javax.faces.context.FacesContext, java.lang.String, java.lang.String)
 at java.lang.Class.throwNoSuchMethodException(Class.java:356)
 at java.lang.Class.getMethod(Class.java:1018)
 at org.richfaces.resource.external.ResourceTrackerForMyFaces.<init>(ResourceTrackerForMyFaces.java:49)
 ... 59 more 

我显然看到了许多使用共享库的建议,但我同样发现,当不使用webphere提供的默认JSF实现时,不支持CDI。

显然,首选的解决方案是进行一次部署战,但我想知道这在websphere中是否可行?

另请注意,此应用程序在weblogic和tomcat7上运行良好

共有1个答案

梁丘伟
2023-03-14

我已经追踪到这个错误,它出现在最新的4.5.9版本中,在类org.richfaces.resource.external.ResourceTrackerImpl中。

该类确定要使用哪个ResourceTracker(Mojarra和Myface都有不同的类),但只是检查MyFaces中的某个类是否在类路径上。就是这种情况,但JSF已初始化为Mojarra。

这是一个新方法,如果使用的JSF实现是Mojarra,我将阻止MyFaces的类查找。

private ResourceTracker getImplementation() {
    ResourceTracker tracker = externalResourceTracker.get();
    if (tracker == null) {
        Class<?> myfacesResUtilClass = null;
        if (!MOJARRA_IMPLTITLE.equals(FacesContext.class.getPackage().getImplementationTitle())) {
            for (String myFacesResourceUtilsClass : MYFACES_RESOURCE_UTILS_CLASSES) {
                try {
                    myfacesResUtilClass = this.getClass().getClassLoader().loadClass(myFacesResourceUtilsClass);
                    break;
                } catch (Exception e) {
                    LOG.debug("could not load myfaces resource utils class: " + myFacesResourceUtilsClass, e);
                }
            }
        }
        if (myfacesResUtilClass != null) {
            externalResourceTracker.compareAndSet(null, new ResourceTrackerForMyFaces(myfacesResUtilClass));
        } else {
            externalResourceTracker.compareAndSet(null, new ResourceTrackerForMojarra());
        }
        tracker = externalResourceTracker.get();
    }

    return tracker;
}

这个问题已经解决了,但它让我非常不安,除了这个bug之外,这个类甚至还检查了一个特定于websphere的类,展示了MyFaces实际上是如何适应于在websphere上工作的,而不是反过来。

 类似资料:
  • 有人知道如何在WebSphere8和IBMEJBJARBND中配置EJB3.1部署描述符吗。使用侦听器端口而不是激活规范的消息驱动bean的xml文件?IBM信息中心在这个问题上非常模糊,我很难确切地知道应该在ejb jar中放入什么。xml和ibm ejb jar bnd。xml文件。 谢谢,丽达

  • Animal.java 我为它创建了以下自定义断言: AnimalAssert.java 编辑:基于第一个答案(cglib需要一个),我用一个no arg构造函数更新了动物类,但是抛出了相同的异常

  • 我的应用程序一直在许多Android平台上报告这个问题(4.1、4.0.4、2.3.6.…)。但我无法在我的手机上复制这个问题。我已经在Google上搜索了这个问题,但堆栈跟踪似乎与我的不一样。

  • 我有一台带有Intel CPU的Windows机器(在引导菜单上启用VMX)。我使用VirtualBox在上面运行Ubuntu Guest。我在上面运行qemu,以运行另一个Guest OS,使用kvm(选项)。 我在尝试插入kvm-intel模块时收到以下错误: 我已经检查了来宾操作系统中的vpx标志,但我也没有看到 有没有办法在来宾Ubuntu操作系统中启用kvm支持,以便我可以在Ubuntu

  • 我试图从java程序中使用Spark SQL,其中pom.xml中的依赖关系指向Spark版本1.6.0。下面是程序 但是,我在线程“main”java.lang.nosuchmethoderror:org.apache.spark.sql.sqlcontext.sql(ljava/lang/string;)lorg/apache/spark/sql/dataframe中出现异常;我正在创建一个平

  • 主机系统为ARCHLinux。我想开发需要运行Windows docker容器的.NET4.6.1应用程序。所以我在VirtualBox下运行Win10。然后我在Win10中安装Docker,以运行Windows Docker容器。Linux->VirtualBox->Win10->Docker->Windows Docker容器->要运行的应用程序。 或者更具体地说,VirtualBox是否支持