]
Teresa Miyar Gil reassigned WFLY-12563:
---------------------------------------
Assignee: Teresa Miyar Gil (was: Farah Juma)
org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL flag ignored when WARs are
embedded in EAR
------------------------------------------------------------------------------------
Key: WFLY-12563
URL:
https://issues.jboss.org/browse/WFLY-12563
Project: WildFly
Issue Type: Bug
Components: JSF
Affects Versions: 15.0.0.Final, 16.0.0.Final, 17.0.0.Final, 18.0.0.Beta1
Reporter: Bartosz Ryndak
Assignee: Teresa Miyar Gil
Priority: Critical
Due to changes indroduced to fix bug WFLY-10796 it is no longer possible to configure
wars embedded in ear to bundle jsf implementation.
Changes made in file JSFDependencyProcessor.java in commit
40f72548985a9f5ca31317b01a4a0ce09ee759aa
From:
{code}
final DeploymentUnit tl = deploymentUnit.getParent() == null ? deploymentUnit :
deploymentUnit.getParent();
String jsfVersion = JsfVersionMarker.getVersion(tl);
{code}
To:
{code}
String jsfVersion = JsfVersionMarker.getVersion(deploymentUnit);
{code}
modified the way jsf version is aquired. Before the change it was always taken from top
level deployment. After it is taken directly from scanned deployment unit without
searching in parent. Unfortunately there was no matching change in a way context params
from web.xml are processed in JSFVersionProcessor:
{code}
final DeploymentUnit topLevelDeployment = deploymentUnit.getParent() == null ?
deploymentUnit : deploymentUnit.getParent();
final WarMetaData metaData = deploymentUnit.getAttachment(WarMetaData.ATTACHMENT_KEY);
List<ParamValueMetaData> contextParams = new
ArrayList<ParamValueMetaData>();
if ((metaData.getWebMetaData() != null) &&
(metaData.getWebMetaData().getContextParams() != null)) {
contextParams.addAll(metaData.getWebMetaData().getContextParams());
}
for (final ParamValueMetaData param : contextParams) {
if ((param.getParamName().equals(WAR_BUNDLES_JSF_IMPL_PARAM) &&
(param.getParamValue() != null) &&
(param.getParamValue().toLowerCase(Locale.ENGLISH).equals("true"))))
{
JsfVersionMarker.setVersion(topLevelDeployment,
JsfVersionMarker.WAR_BUNDLES_JSF_IMPL);
break; // WAR_BUNDLES_JSF_IMPL always wins
}
if (param.getParamName().equals(JSF_CONFIG_NAME_PARAM)) {
JsfVersionMarker.setVersion(topLevelDeployment, param.getParamValue());
break;
}
}
{code}
So the information about org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL flag is only set in
top level deployment unit.
This causes Mojarra-2.0 to be returned as jsf version during checks in
JSFDependencyProcessor for embedded wars and leads to initialization of default mojarra
implementation before bundled implementation is processed. As both implementations are
loaded class conflicts occur and it is not possible to properly initialize jsf. In case of
myfaces this leads to below error:
{code}
2019-09-16 10:46:23,405 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool --
86) MSC000001: Failed to start service
jboss.deployment.subunit."xxx.ear"."yyy.war".undertow-deployment:
org.jboss.msc.service.StartException in service
jboss.deployment.subunit."xxx.ear"."yyy.war".undertow-deployment:
java.lang.RuntimeException: java.lang.IllegalStateException: Could not find backup for
factory javax.faces.application.ApplicationFactory.
at
org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:81)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at
org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
at
org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
at
org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
at java.lang.Thread.run(Thread.java:748)
at org.jboss.threads.JBossThread.run(JBossThread.java:485)
Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: Could not find
backup for factory javax.faces.application.ApplicationFactory.
at
io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:252)
at
org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:96)
at
org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:78)
... 8 more
Caused by: java.lang.IllegalStateException: Could not find backup for factory
javax.faces.application.ApplicationFactory.
at javax.faces.FactoryFinderInstance.notNullFactory(FactoryFinderInstance.java:524)
at javax.faces.FactoryFinderInstance.getFactory(FactoryFinderInstance.java:207)
at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:279)
at
org.apache.myfaces.context.servlet.FacesContextImplBase.getApplication(FacesContextImplBase.java:159)
at
org.apache.myfaces.context.servlet.FacesContextImplBase.getELContext(FacesContextImplBase.java:210)
at javax.faces.component.UIViewRoot.setLocale(UIViewRoot.java:1602)
at
org.apache.myfaces.webapp.AbstractFacesInitializer._createFacesContext(AbstractFacesInitializer.java:477)
at
org.apache.myfaces.webapp.AbstractFacesInitializer.initStartupFacesContext(AbstractFacesInitializer.java:449)
at
org.apache.myfaces.webapp.StartupServletContextListener.contextInitialized(StartupServletContextListener.java:113)
at
io.undertow.servlet.core.ApplicationListeners.contextInitialized(ApplicationListeners.java:187)
at
io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:216)
at
io.undertow.servlet.core.DeploymentManagerImpl$1.call(DeploymentManagerImpl.java:185)
at
io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
at
io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at
org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
at
org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
at
org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
at
org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
at
org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1502)
at
io.undertow.servlet.core.DeploymentManagerImpl.deploy(DeploymentManagerImpl.java:250)
... 10 more
{code}