Changing faces-config.xml from 2.2 to 2.3 causes javax.el.PropertyNotFoundException: Target Unreachable, identifier 'bean' resolved to null
Asked Answered
F

4

13

Have the following code snippets:

Bean:

import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named(value = "directoryBean")
@ViewScoped
public class DirectoryBean implements Serializable {

private static final long serialVersionUID = 1L;
    ....
}

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd"
    version="2.3">
     ....
</faces-config>

group.xhtml

<ui:composition ...>

    <f:metadata>
        <f:viewParam name="id" value="#{directoryBean.id}" />
    </f:metadata>

</ui:composition>

In result getting the exception:

javax.el.PropertyNotFoundException: /group.xhtml @6,64 value="#{directoryBean.id}": Target Unreachable, identifier 'directoryBean' resolved to null

Got it after changing faces-config.xml from ver 2.2 to ver 2.3 syntax.

Meaning, with faces-config.xml with the following content everything works fine:

<faces-config version="2.2" 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 http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd">
....
</faces-config>

JSF 2.3.2 deployed on the Payara 4.1.2.172 (Full) server, and also added to pom.xml with "provided" scope.

....
<dependencies>
    ...
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.faces</artifactId>
        <version>2.3.2</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.faces</groupId>
        <artifactId>javax.faces-api</artifactId>
        <version>2.3</version>
        <scope>provided</scope>            
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    ...
</dependencies>
....

I have checked all solutions that I was able to find during several hours, including different version of beans.xml:

  1. initially beans.xml was not present in the project - issue persist;
  2. added empty beans.xml - issue persist;
  3. added beans.xml with two different options of bean-discovery-mode - "all" and "annotated" - issue persist;

Content of \WEB-INF\beans.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans 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 http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       bean-discovery-mode="all">
</beans>

Tested on local instances of Payara 4.1.2.172, GlassFish 5 (java ver 1.8.0_144), and remote instance of Payara 4.1.2.172 (java ver 1.8.0_131).

Thanks!

Note: Example projects like this one https://github.com/AnghelLeonard/JSF-2.3/tree/master/JSF23InjectInConverterValidator give the same error.

===

Update as of 2022-03-31:

Got another error related to this issue on Payara 5.2022.1: org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408: Unsatisfied dependencies for type UIViewRoot with qualifiers @Default So seems even on the latest version of Payara JSF 2.3 is not enabled by default, as was mentioned in one of the comments below. Adding it here for better searching visibility. :)

Flophouse answered 14/8, 2017 at 20:9 Comment(9)
Did you just change the faces-config? Meaning you were already on a JSF 2.3.2 release and just changed the faces-config?Iceni
Yes, exactly! Reverting faces-config back to JSF 2.2 syntax - solves the issue.Flophouse
A small quick google search resulted in this: stackoverflow.com/questions/44064995/…. Are you using an 'external' JSF lib too? One provided in your webapp?Iceni
Thank you, yep, I also have checked that post and many others... But so far no solution helped. Re your question: on Payara 4.1.2 and GlassFish 4.1.2 - yes, I have manually replaced original JSF 2.2.X javax.faces.jar with JSF 2.3.2 jar. But GlassFish 5 already shipped with JSF 2.3.2 - but there I got the same error... BTW: have found the similar issue in Mojarra issues tracker: github.com/javaserverfaces/mojarra/issues/4264Flophouse
Please next type post what you tried, read, etc... Saves us time. See also How to Ask!!!Iceni
beans.xml tested with all possible options - added the details about my test with beans.xml. Thank you!Flophouse
you have this --> at the end of your schemaLocation is that a typing error? could that be causing the poblem?Infringement
yes, thank you, corrected, was just a mistype...Flophouse
Everyone, any ideas how to fix the issue? ...as it is simply not possible to switch to JSF 2.3... Can somebody share how you deploy your JSF 2.3.X environment, or point to such docs? Thank you!Flophouse
F
20

I would like to post a complete solution, what should be done in order to make JSF 2.3 libs work in JSF v2.3 mode. Code samples below are based on GlassFish 5.0 server environment.

1) Upgrade JSF libs to the version 2.3.3 at least (it fixes some bugs related to jsf 2.3 mode activation)

2) The beans.xml should look like:

<?xml version="1.0" encoding="UTF-8"?>
<beans 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 http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
   bean-discovery-mode="all" version="2.0">
</beans>

3) faces-config.xml should look like:

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.3"
          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 http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd">
    ....
</faces-config>

4) And the key-player in all this setup - is specially formed Java class that actually activates JSF 2.3 mode, in my case it has name Jsf23Activator and absolutely empty content:

package ua.local.beans;

import javax.enterprise.context.ApplicationScoped;
import javax.faces.annotation.FacesConfig;

@ApplicationScoped
@FacesConfig(version = FacesConfig.Version.JSF_2_3)
public class Jsf23Activator {

}

The annotation @FacesConfig(version = FacesConfig.Version.JSF_2_3) is added once per project, no need to add it several times.

Basically the need to add this annotation was mentioned several times by others, but in my case it didn't work until I declared this class as CDI bean by adding annotation @ApplicationScoped. Only after I declared the class as CDI bean, cleared project / restarted server - the JSF 2.3 mode finally got activated and now I am able to inject JSF classes / utilize other JSF 2.3 features!

Flophouse answered 23/11, 2017 at 3:34 Comment(4)
Thanks, adding the @ApplicationScoped on the activator bean was the crucial step for me. FWIW in my setup (Payara 5.181) I don't have a beans.xml or a faces-config.xml, so I don't think they are strictly necessary.Kopje
While your answer works like a charm this is a ridiculous configuration kerfuffle to use JSF 2.3 features. Thanks for sharing.Nicotinism
@MartinCharlesworth Maybe a bean defining annotation is necessary, so the class is actually discovered.Vc
Do we really need a beans.xml in this case? Since @ApplicationScoped is a bean defining annotation, this archive creates an implicit archive.Vc
H
3

I had this problem because after the update of JSF i still had this jar in my classpath :

el-impl-2.1.2.jar

After deleting this one the problem went away.

Heartbreak answered 11/10, 2019 at 5:22 Comment(0)
W
1

in DirectoryBean add this line:

// Activates CDI build-in beans
 @FacesConfig(
         version = JSF_2_3
)

and in beans.xml change bean-discovery-mode to "all". faces-config.xml set version 2.3

Woodward answered 22/9, 2017 at 6:53 Comment(3)
Where did you get this info from? Do you have a link? I'm interested in more of the details. ThanksIceni
Thanks! @Iceni we had an extensive discussion of this topic here: github.com/javaserverfaces/mojarra/issues/4264Flophouse
I am trying to set up a JSF 2.3 webapp with the new CDI, but it seems too complicated. No errors are being thrown. stackoverflow.com/questions/51255117/…Neurology
P
0

Solution 2:

switch to Payara 5.183, it works out of the box. No need for solution 1: Jsf23Activator

Pillbox answered 7/11, 2018 at 13:57 Comment(1)
FYI: On Payara 5.2022.1 it didn't work out of the box.Flophouse

© 2022 - 2024 — McMap. All rights reserved.