[ 
https://issues.apache.org/jira/browse/MYFACES-4766?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18118039#comment-18118039
 ] 

Vicente Rossello Jaume commented on MYFACES-4766:
-------------------------------------------------

https://github.com/apache/myfaces/pull/1084

> BeanPropertyTagRule: bug with concurrency
> -----------------------------------------
>
>                 Key: MYFACES-4766
>                 URL: https://issues.apache.org/jira/browse/MYFACES-4766
>             Project: MyFaces Core
>          Issue Type: Bug
>    Affects Versions: 2.3-next-M8, 2.3.12, 3.0.4, 4.1.4
>         Environment: Tomee 8.x
>            Reporter: Vicente Rossello Jaume
>            Priority: Major
>
> 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 CI 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