【问题标题】:JSF Mojarra 2.2 on Websphere 8.xWebsphere 8.x 上的 JSF Mojarra 2.2
【发布时间】:2015-12-25 21:46:36
【问题描述】:

多年来,我们一直在 Websphere 7 和 8 上运行 JSF 1.2 应用程序。我们使用捆绑的 JSF 构建我们的战争,并始终将类加载器设置为 PARENT LAST。

现在已升级到 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 

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

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

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

【问题讨论】:

  • 您在标题中提到了 Mojarra。异常消息指出它是 MyFaces。
  • @Tiny: AND Mojarra: com.sun.faces.renderkit.html_basic.ScriptRenderer.encodeEnd(ScriptRenderer.java:104)... 其他类是否与“战斧”相关(有些肯定是,但 shared_impl 可能不是...见issues.jboss.org/browse/RF-13901 所以OP很可能是正确的,实际上使用了mojarra
  • Mojarra 肯定在类路径中,tomahawk 也是。由于它是 websphere,所以 myfaces 也有变化,但我的问题正是针对如何让我的应用程序在 WAS 上运行,就像在我尝试过的所有其他服务器上一样。
  • 尝试配置jsf为隔离共享库,查看How to make websphere 8.5 use mojarra not myfaces

标签: jsf jsf-2 websphere richfaces mojarra


【解决方案1】:

我已将此归结为 Richfaces 中的一个错误,该错误出现在最新版本 4.5.9 中,类别为 org.richfaces.resource.external.ResourceTrackerImpl

该类确定要使用哪个 ResourceTracker(Mojarra 和 Myfaces 有不同的类),但只是检查 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;
}

它已经解决了,但是让我非常不安的是,除了这个错误之外,这个类甚至检查了一个 websphere 特定的类,显示了 MyFaces 实际上是如何适应在 Websphere 上工作的,而不是相反。

【讨论】:

  • 抱歉没有看到您的问题链接。当时被拒绝,但附注“补丁将受到欢迎并在可用时进行审查”。所以,他们现在有一个通过新问题issues.jboss.org/browse/RF-14155
  • 太棒了……希望他们“修复”由于一些 websphere 异常而导致的这种奇怪的解决方法
猜你喜欢
  • 2011-10-15
  • 2014-05-16
  • 2023-04-06
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多