Uploaded image for project: 'JBoss Enterprise Application Platform'
  1. JBoss Enterprise Application Platform
  2. JBEAP-17863

[GSS](7.3.z) WFLY-12563 - org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL flag ignored when WARs are embedded in EAR

XMLWordPrintable

    • +
    • Hide

      Create ear with embedded war. Set org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL flag to true in wars web.xml. Observe that default jsf implementation is still loaded during server startup.

      Show
      Create ear with embedded war. Set org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL flag to true in wars web.xml. Observe that default jsf implementation is still loaded during server startup.

      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:

      final DeploymentUnit tl = deploymentUnit.getParent() == null ? deploymentUnit : deploymentUnit.getParent();
      String jsfVersion = JsfVersionMarker.getVersion(tl);
      

      To:

      String jsfVersion = JsfVersionMarker.getVersion(deploymentUnit);
      

      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:

      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;
               }
      }
      

      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:

      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
      

              rhn-support-tmiyargi Teresa Miyar Gil (Inactive)
              rpelisse@redhat.com Romain Pelisse
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

                Created:
                Updated:
                Resolved: