SteveOhio
SteveOhio

Reputation: 589

How to update JSF 2.2 to JSF 2.3 using Maven in a Spring Application

I'm using MAVEN and already changed my pom.xml dependencies from:

<dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-api</artifactId>
        <version>2.2.14</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.13</version>
        <scope>compile</scope>
        <optional>true</optional>
    </dependency>

to:

<dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.faces</artifactId>
        <version>2.3.0</version>
    </dependency>

but now I get a build error:

javax.faces.FacesException: Unable to find CDI BeanManager at com.sun.faces.el.ELUtils.tryAddCDIELResolver(ELUtils.java:312) ~[javax.faces-2.3.0.jar:2.3.0] at com.sun.faces.el.ELUtils.buildFacesResolver(ELUtils.java:242) ~[javax.faces-2.3.0.jar:2.3.0] at com.sun.faces.application.ApplicationAssociate.initializeELResolverChains(ApplicationAssociate.java:484) ~[javax.faces-2.3.0.jar:2.3.0] at com.sun.faces.application.ApplicationImpl.performOneTimeELInitialization(ApplicationImpl.java:1404) ~[javax.faces-2.3.0.jar:2.3.0] at com.sun.faces.application.ApplicationImpl.getELResolver(ApplicationImpl.java:526) ~[javax.faces-2.3.0.jar:2.3.0] at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:256) ~[javax.faces-2.3.0.jar:2.3.0] at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4725) [tomcat-embed-core-8.5.5.jar:8.5.5] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5189) [tomcat-embed-core-8.5.5.jar:8.5.5] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.5.jar:8.5.5] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1403) [tomcat-embed-core-8.5.5.jar:8.5.5] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) [tomcat-embed-core-8.5.5.jar:8.5.5] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_111] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]

2017-05-15 11:12:44.071 ERROR 9936 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener

java.lang.RuntimeException: javax.faces.FacesException: Unable to find CDI BeanManager at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:315) ~[javax.faces-2.3.0.jar:2.3.0] at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4725) [tomcat-embed-core-8.5.5.jar:8.5.5] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5189) [tomcat-embed-core-8.5.5.jar:8.5.5] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.5.jar:8.5.5] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1403) [tomcat-embed-core-8.5.5.jar:8.5.5] at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393) [tomcat-embed-core-8.5.5.jar:8.5.5] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_111] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111] Caused by: javax.faces.FacesException: Unable to find CDI BeanManager at com.sun.faces.el.ELUtils.tryAddCDIELResolver(ELUtils.java:312) ~[javax.faces-2.3.0.jar:2.3.0] at com.sun.faces.el.ELUtils.buildFacesResolver(ELUtils.java:242) ~[javax.faces-2.3.0.jar:2.3.0] at com.sun.faces.application.ApplicationAssociate.initializeELResolverChains(ApplicationAssociate.java:484) ~[javax.faces-2.3.0.jar:2.3.0] at com.sun.faces.application.ApplicationImpl.performOneTimeELInitialization(ApplicationImpl.java:1404) ~[javax.faces-2.3.0.jar:2.3.0] at com.sun.faces.application.ApplicationImpl.getELResolver(ApplicationImpl.java:526) ~[javax.faces-2.3.0.jar:2.3.0] at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:256) ~[javax.faces-2.3.0.jar:2.3.0]

I also updated the version in my faces-config.xml to 2.3:

<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
          version="2.3">
<application>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
    <el-resolver>org.primefaces.application.exceptionhandler.PrimeExceptionHandlerELResolver</el-resolver>
</application>

<factory>
    <exception-handler-factory>org.primefaces.application.exceptionhandler.PrimeExceptionHandlerFactory</exception-handler-factory>
</factory>

Are there more changes to make in the pom.xml or anywhere else in my application?

Upvotes: 4

Views: 15786

Answers (3)

Hammad
Hammad

Reputation: 101

  1. Add CDI and weld dependency pom.xml
    <dependency>
        <groupId>javax.enterprise</groupId>
        <artifactId>cdi-api</artifactId>
        <version>1.2</version>
    </dependency>
    
    <dependency>
        <groupId>org.jboss.weld.servlet</groupId>
        <artifactId>weld-servlet</artifactId>
        <version>2.2.9.Final</version>
    </dependency>
    
  2. create beans.xml in WEB-INF
    <?xml version="1.0" encoding="UTF-8"?>
    <beans
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:weld="http://jboss.org/schema/weld/beans"
        xsi:schemaLocation="
        http://java.sun.com/xml/ns/javaee http://jboss.org/schema/cdi/beans_1_0.xsd
        http://jboss.org/schema/weld/beans http://jboss.org/schema/weld/beans_1_1.xsd">
    
      <weld:scan>
        <weld:exclude name="org.springframework.data.jpa.repository.cdi.**" />
        <weld:exclude name="com.example.beans.**" />
      </weld:scan>
    </beans>
    

Upvotes: 1

Victor_Magalhaes
Victor_Magalhaes

Reputation: 51

Well, my answear may appears unrelated to this question, but it is... I experienced exactly this exception, and it was not the first time. I have one enviroment in production and another, for development. They are identical, as much as possible. My environment is glassfish 4.1.2, updated to use mojarra 2.3 (I've swapped the glassfish4/glassfish/modules/javax.faces.jar file). I have some secure certificates in one .jks file, and this information is very important, one jvm setting called "-Djavax.net.ssl.trustStorePassword", with default value "changeit". For some strange reason this setting disappeared in one deploy. I don't know why, but it happened. My conclusion is that this missing setting had thrown one exception BEFORE the exception "javax.faces.FacesException: Unable to find CDI BeanManager" and I could not diagnose it. That was the only differece between this two environments. So, if your application is throwing this exception and it uses some .jks file, just verify that this setting is not missing in your jvm settings.

Upvotes: 0

Leon
Leon

Reputation: 119

Old question, but for people still facing this problem: To avoid the "Unable to find CDI BeanManager" error, it's important that your faces-config.xml version is not 2.3 and your web.xml version is not 4.0!

The Mojarra implementation ELUtils class contains the following nice bit of code:

if (getFacesConfigXmlVersion(facesContext).equals("2.3") || getWebXmlVersion(facesContext).equals("4.0")) {
                throw new FacesException("Unable to find CDI BeanManager");
}

When using lower versions, it skips this check, and works with Spring DI instead of CDI.

Upvotes: 11

Related Questions