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)