Ulrich Becker created MYFACES-4760:
--------------------------------------

             Summary: QuarkusApplication.getELResolver() introduces data race
                 Key: MYFACES-4760
                 URL: https://issues.apache.org/jira/browse/MYFACES-4760
             Project: MyFaces Core
          Issue Type: Bug
          Components: Extension Feature
    Affects Versions: 4.1.3, 5.0.0
         Environment: myfaces-quarkus 4.1.3, quarkus-primefaces 3.13.11, 
quarkus-primefaces-extensions 3.13.11, jakarta.el-api 6.0.1, expressly 6.0.0
            Reporter: Ulrich Becker


On a freshly started application, the first page load fails intermittently. 
Subsequent requests  succeed. Stack trace (excerpt):
jakarta.el.ELException: java.lang.NullPointerException: Cannot invoke
"jakarta.el.ELResolver.convertToType(...)" because "this.elResolvers[i]" is null
    at jakarta.el.ELContext.convertToType(ELContext.java:435)
    at 
org.glassfish.expressly.lang.EvaluationContext.convertToType(EvaluationContext.java:141)
    at 
org.glassfish.expressly.ValueExpressionImpl.getValue(ValueExpressionImpl.java:142)
    at 
org.apache.myfaces.application.ApplicationImpl.evaluateExpressionGet(ApplicationImpl.java:515)
    ...
Caused by: java.lang.NullPointerException: ... "this.elResolvers[i]" is null
    at 
jakarta.el.CompositeELResolver.convertToType(CompositeELResolver.java:446)



{{ApplicationImpl}} builds its resolver chain inside a synchronized 
{{Lazy<ELResolver>}} with safe publication, so core is not affected. However, 
on Quarkus, 
{{org.apache.myfaces.core.extensions.quarkus.runtime.application.QuarkusApplication}}
 overrides {{getELResolver() and exposes a possibly partially built 
elResolver.}}

{{I see two ways to fix this:}}
{{1) QuarkusApplication uses Lazy just as ApplicationImpl does}}
{{2) A protected method in Application that provides the ELResolverBuilder. 
QuarkusApplication can then override this method to supply its 
QuarkusELResolverBuilder}}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to