mjn
mjn

Reputation: 36654

JSF 2 error "Unable to instantiate ExpressionFactory" on App Engine

With a new JSF 2.0 app created in NetBeans 6.9.1 this error message appears in the log file on startup on the production server:

com.sun.faces.config.ConfigureListener contextInitialized: Initializing Mojarra 2.0.2 (FCS b10) for context ''

com.sun.faces.spi.InjectionProviderFactory createInstance: JSF1048: PostConstruct/PreDestroy annotations present. ManagedBeans methods marked with these annotations will have said annotations processed.

> com.sun.faces.config.ConfigureListener installExpressionFactory: Unable to instantiate ExpressionFactory 'com.sun.el.ExpressionFactoryImpl'

Failed startup of context com.google.apphosting.utils.jetty.RuntimeAppEngineWebAppContext@7616ad{/,/base/data/home/apps/scroogedemo/1.350894485313261302} com.sun.faces.config.ConfigurationException: It appears the JSP version of the container is older than 2.1 and unable to locate the EL RI expression factory, com.sun.el.ExpressionFactoryImpl. If not using JSP or the EL RI, make sure the context initialization parameter, com.sun.faces.expressionFactory, is properly set. at com.sun.faces.config.ConfigureListener.registerELResolverAndListenerWithJsp(ConfigureListener.java:638)

The app uses the JSF 2.0 reference implementation provided by NetBeans, which seems to include the EL RI (package javax.faces.el).

The application runs fine in the development server. I use these configuration entries in web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    ...
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Production</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>server</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>
    <context-param>
        <param-name>com.sun.faces.enableThreading</param-name>
        <param-value>false</param-value>
    </context-param>

I checked the page https://sites.google.com/a/wildstartech.com/adventures-in-java/Java-Platform-Enterprise-Edition/JavaServer-Faces/sun-javaserver-faces-reference-implementation/configuring-jsf-20-to-run-on-the-google-appengine/javaserverfaces-20-and-google-app-engine-compatibility-issues for information on this error but this problem is not covered there.

Update: the page mentioned above said that the el-api and el-impl files need to be included in the project. They are not in the NetBeans libraries list, so they have not been uploaded in the server deployment procedure. I guess they are provided by the local development server - but missing on the production GAE. It turned out to be the solution, see below.

Upvotes: 1

Views: 7403

Answers (2)

Iakov Senatov
Iakov Senatov

Reputation: 149

just add this:

    public ServletContextInitializer servletContextInitializer() {
          .....

            sc.setInitParameter("com.sun.faces.expressionFactory", "org.apache.el.ExpressionFactoryImpl");
          .....
}

Upvotes: -1

mjn
mjn

Reputation: 36654

Deploying the app with el-api-2.2.jar and el-impl-2.2.jar solved the problem.

Upvotes: 3

Related Questions