Websphere 上的 JSF Mojarra 2.2 8.x
JSF Mojarra 2.2 on Websphere 8.x
多年来,我们一直是 运行 Websphere 7 和 8 上的 JSF 1.2 应用程序。我们构建 war 时捆绑了 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.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。
首选的解决方案显然是单一部署 war,但我想知道这在 websphere 中是否可行?
另请注意,此应用程序在 weblogic 和 tomcat7 上运行良好
我已将此归结为 Richfaces 中的一个错误,该错误存在于 class org.richfaces.resource.external.ResourceTrackerImpl
.
的最新版本 4.5.9 中
class 决定使用哪个 ResourceTracker(Mojarra 和 Myfaces 有不同的 classes),但只是检查 MyFaces 中的 class 是否在 class路径。是这样的,但是 JSF 已经初始化为 Mojarra。
这是新方法,如果使用的 JSF 实现是 Mojarra,我会阻止 class 查找 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;
}
它已经解决了,但让我非常不安的是,除了这个错误,这个 class 甚至检查特定的 websphere class,显示 MyFaces 实际上是如何适应的Websphere,而不是相反。
多年来,我们一直是 运行 Websphere 7 和 8 上的 JSF 1.2 应用程序。我们构建 war 时捆绑了 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.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。
首选的解决方案显然是单一部署 war,但我想知道这在 websphere 中是否可行?
另请注意,此应用程序在 weblogic 和 tomcat7 上运行良好
我已将此归结为 Richfaces 中的一个错误,该错误存在于 class org.richfaces.resource.external.ResourceTrackerImpl
.
class 决定使用哪个 ResourceTracker(Mojarra 和 Myfaces 有不同的 classes),但只是检查 MyFaces 中的 class 是否在 class路径。是这样的,但是 JSF 已经初始化为 Mojarra。
这是新方法,如果使用的 JSF 实现是 Mojarra,我会阻止 class 查找 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;
}
它已经解决了,但让我非常不安的是,除了这个错误,这个 class 甚至检查特定的 websphere class,显示 MyFaces 实际上是如何适应的Websphere,而不是相反。