Vicente Rossello Jaume created MYFACES-4766:
-----------------------------------------------

             Summary: BeanPropertyTagRule: bug with concurrency
                 Key: MYFACES-4766
                 URL: https://issues.apache.org/jira/browse/MYFACES-4766
             Project: MyFaces Core
          Issue Type: Bug
    Affects Versions: 4.1.4, 3.0.4, 2.3.12, 2.3-next-M8
         Environment: Tomee 8.x
            Reporter: Vicente Rossello Jaume


I was having an occasional problem with this class. It usually happened
once or twice a day, in CI environment (110 concurrent E2E tests) and
production.

The problem is related to concurrency. With AI assistance I could identify
and write a patch. I've been using it for a week and didn't have any more
bugs of this type.

The error with the location always pointed to a xhtml line with some static
attribute like lazy="true" or queryDelay="100"

I'm using myfaces 2.3-next-M9, but I think all versions are affected.


The stacktrace:

javax.faces.view.facelets.TagAttributeException:
//var/jenkins_home/workspace/tr2-pull-requests/tr2-web/src/main/webapp/xxx.xhtml
at line 32 and column 83 lazy="true" java.lang.NullPointerException: Cannot
invoke "java.lang.Number.intValue()" because the return value of
"sun.invoke.util.ValueConversions.primitiveConversion(sun.invoke.util.Wrapper,
Object, boolean)" is null
at
org.apache.myfaces.view.facelets.tag.BeanPropertyTagRule$LiteralPropertyMetadata.applyMetadata(BeanPropertyTagRule.java:138)
at
org.apache.myfaces.view.facelets.tag.MetadataImpl.applyMetadata(MetadataImpl.java:45)
2 lines skipped for [javax.faces]
at
org.apache.myfaces.view.facelets.tag.jsf.ComponentTagHandlerDelegate.apply(ComponentTagHandlerDelegate.java:281)
3 lines skipped for [javax.faces]
at
org.apache.myfaces.view.facelets.tag.jsf.ComponentTagHandlerDelegate.apply(ComponentTagHandlerDelegate.java:362)
1 line skipped for [javax.faces]
at
org.apache.myfaces.view.facelets.tag.composite.CompositeComponentResourceTagHandler.apply(CompositeComponentResourceTagHandler.java:742)
at
org.apache.myfaces.view.facelets.impl.DefaultFaceletContext$CompositeComponentTemplateManager.apply(DefaultFaceletContext.java:526)
at
org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeCompositeComponentDefinition(DefaultFaceletContext.java:485)
at
org.apache.myfaces.view.facelets.tag.composite.InsertChildrenHandler.apply(InsertChildrenHandler.java:77)
at
org.apache.myfaces.view.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:83)
at
org.apache.myfaces.view.facelets.tag.ui.DecorateHandler.apply(DecorateHandler.java:254)
at
org.apache.myfaces.view.facelets.impl.TemplateContextImpl$TemplateManagerImpl.apply(TemplateContextImpl.java:192)
at
org.apache.myfaces.view.facelets.impl.TemplateContextImpl.includeDefinition(TemplateContextImpl.java:137)
at
org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:423)
at
org.apache.myfaces.view.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:94)
2 lines skipped for [javax.faces]
at
org.apache.myfaces.view.facelets.tag.jsf.ComponentTagHandlerDelegate.apply(ComponentTagHandlerDelegate.java:362)
2 lines skipped for [javax.faces]
at
org.apache.myfaces.view.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:147)
at
org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:67)
at
org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:49)
at
org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:510)
at
org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:566)
at
org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:543)
at
org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:216)
at
org.apache.myfaces.view.facelets.tag.ui.DecorateHandler.apply(DecorateHandler.java:199)
at
org.apache.myfaces.view.facelets.tag.composite.ImplementationHandler.apply(ImplementationHandler.java:66)
1 line skipped for [javax.faces]
at
org.apache.myfaces.view.facelets.tag.composite.CompositeComponentDefinitionTagHandler.apply(CompositeComponentDefinitionTagHandler.java:254)
at
org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:67)
at
org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:49)
at
org.apache.myfaces.view.facelets.impl.DefaultFacelet.applyCompositeComponent(DefaultFacelet.java:601)
at
org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.applyCompositeComponent(DefaultFaceletContext.java:611)
at
org.apache.myfaces.view.facelets.tag.composite.CompositeComponentResourceTagHandler.applyCompositeComponentFacelet(CompositeComponentResourceTagHandler.java:462)
at
org.apache.myfaces.view.facelets.tag.composite.CompositeComponentResourceTagHandler.applyNextHandler(CompositeComponentResourceTagHandler.java:236)
at
org.apache.myfaces.view.facelets.tag.jsf.ComponentTagHandlerDelegate.apply(ComponentTagHandlerDelegate.java:362)
1 line skipped for [javax.faces]
at
org.apache.myfaces.view.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:147)
at
org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:67)
at
org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:49)
at
org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:510)
at
org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:566)
at
org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:543)
at
org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:216)
at
org.apache.myfaces.view.facelets.tag.ui.IncludeHandler.apply(IncludeHandler.java:215)
1 line skipped for [javax.faces]
at
org.apache.myfaces.view.facelets.tag.ui.DefineHandler.applyDefinition(DefineHandler.java:83)
at
org.apache.myfaces.view.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:160)
at
org.apache.myfaces.view.facelets.impl.TemplateContextImpl$TemplateManagerImpl.apply(TemplateContextImpl.java:192)
at
org.apache.myfaces.view.facelets.impl.TemplateContextImpl.includeDefinition(TemplateContextImpl.java:137)
at
org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:423)
at
org.apache.myfaces.view.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:94)
2 lines skipped for [javax.faces]
at
org.apache.myfaces.view.facelets.tag.jsf.ComponentTagHandlerDelegate.apply(ComponentTagHandlerDelegate.java:362)
2 lines skipped for [javax.faces]
at
org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:67)
1 line skipped for [javax.faces]
at
org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:49)
at
org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:510)
at
org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:566)
at
org.apache.myfaces.view.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:543)
at
org.apache.myfaces.view.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:216)
at
org.apache.myfaces.view.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:138)
at
org.apache.myfaces.view.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:67)
at
org.apache.myfaces.view.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:49)
at
org.apache.myfaces.view.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:182)
at
org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.buildView(FaceletViewDeclarationLanguage.java:435)
at
org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:83)
at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241)
3 lines skipped for [org.apache.catalina, javax.faces]
at
org.omnifaces.filter.FacesExceptionFilter.doFilter(FacesExceptionFilter.java:118)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
2 lines skipped for [org.apache.catalina]
at com.tr2.web.filter.LoginWebFilter.doFilter(LoginWebFilter.java:106)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
2 lines skipped for [org.apache.catalina]
at
com.tr2.web.bean.agencycollectivepassword.AgencyCollectivePasswordFilter.doFilter(AgencyCollectivePasswordFilter.kt:43)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
2 lines skipped for [org.apache.catalina]
at com.tr2.web.filter.AgencyFilter.doFilter(AgencyFilter.java:48)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
2 lines skipped for [org.apache.catalina]
at com.tr2.web.filter.MicrositeFilter.doFilter(MicrositeFilter.java:95)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
5 lines skipped for [org.apache.catalina, org.apache.tomcat]
at org.apache.openejb.server.httpd.EEFilter.doFilter(EEFilter.java:67)
2 lines skipped for [org.apache.catalina]
at
org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:226)
2 lines skipped for [org.apache.catalina]
at com.tr2.web.filter.SassCompileFilter.doFilter(SassCompileFilter.java:61)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
2 lines skipped for [org.apache.catalina]
at com.tr2.web.filter.AdminFilter.doFilter(AdminFilter.java:42)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
2 lines skipped for [org.apache.catalina]
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:239)
at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:215)
at
net.bull.javamelody.TravelcMonitoringFilter.doFilter(TravelcMonitoringFilter.java:84)
2 lines skipped for [org.apache.catalina]
at
com.tr2.web.filter.RequestLogFilter.internalDoFilter(RequestLogFilter.java:127)
at com.tr2.web.filter.RequestLogFilter.doFilter(RequestLogFilter.java:69)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
2 lines skipped for [org.apache.catalina]
at com.tr2.web.filter.CacheFilter.doFilter(CacheFilter.java:30)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
2 lines skipped for [org.apache.catalina]
at
org.omnifaces.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:123)
at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108)
4 lines skipped for [org.apache.catalina]
at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
3 lines skipped for [org.apache.catalina]
at
org.apache.tomee.catalina.OpenEJBSecurityListener$RequestCapturer.invoke(OpenEJBSecurityListener.java:97)
13 lines skipped for [org.apache.catalina, org.apache.tomcat,
org.apache.coyote]
at java.base/java.lang.Thread.run(Thread.java:1527)
Caused by: java.lang.IllegalArgumentException:
java.lang.NullPointerException: Cannot invoke "java.lang.Number.intValue()"
because the return value of
"sun.invoke.util.ValueConversions.primitiveConversion(sun.invoke.util.Wrapper,
Object, boolean)" is null
at
java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:114)
at java.base/java.lang.reflect.Method.invoke(Method.java:583)
at
org.apache.myfaces.view.facelets.tag.BeanPropertyTagRule$LiteralPropertyMetadata.applyMetadata(BeanPropertyTagRule.java:129)
... 156 more
Caused by: java.lang.NullPointerException: Cannot invoke
"java.lang.Number.intValue()" because the return value of
"sun.invoke.util.ValueConversions.primitiveConversion(sun.invoke.util.Wrapper,
Object, boolean)" is null
at
java.base/sun.invoke.util.ValueConversions.unboxBoolean(ValueConversions.java:108)
at
java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
... 158 more

With AI assistance, I could write a patch
https://github.com/Travelcompositor/myfaces/commit/4b8d40f554df93f1398e6668e82aa50228198fcf
. I haven't had any more bugs of this type, so I consider this patch useful.


AI analysis:

This is a MyFaces concurrency bug, not a Tomcat error and not invalid XHTML 
data.
The reported request failed on S599 at 2026-09-13 06:10:38 UTC, while rendering 
show-booking.xhtml.
MyFaces identified [`xxx.xhtml` (line 77)](/E:/proyectos/xxxx.xhtml:77), 
specifically the literal size="100".
In the last week, Graylog contains 10 incidents between September 9–17: nine in 
and one in production. They affect unrelated literal primitive attributes 
including int, boolean, and long.
Each incident appears three times because 3 classes log the same exception.
The cause is BeanPropertyTagRule.LiteralPropertyMetadata. MyFaces lazily caches 
the converted literal in:
private Object[] valueArgs;
That shared field is neither volatile nor synchronized. During concurrent first 
renders, one thread can observe the array reference before its element is 
visible. Reflection consequently receives null for a primitive setter, 
producing exactly:
ValueConversions.primitiveConversion(...)
Cannot invoke Number.intValue()/longValue() ... is null
The application explicitly disables MyFaces’ lambda-metafactory path in 
web.xml, so it uses this reflection/valueArgs branch. The dependency is the 
patched MyFaces 2.3-next-M9.
Recommended fix: patch MyFaces so valueArgs is safely published—minimally make 
it volatile, preferably initialize it under synchronization or stop caching the 
argument array. Changing individual XHTML literals would only move the failure 
elsewhere. Enabling USE_LAMBDA_METAFACTORY may avoid this exact branch, but it 
was deliberately disabled previously and is a less controlled workaround.

My applied patch works and uses the third proposed option (stop caching the 
argument array), since I think is optimal.




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

Reply via email to