You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Vicente Rossello Jaume (Jira)" <de...@myfaces.apache.org> on 2026/09/22 13:45:00 UTC
[jira] [Commented] (MYFACES-4766) BeanPropertyTagRule: bug with concurrency
[ https://issues.apache.org/jira/browse/MYFACES-4766?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18118029#comment-18118029 ]
Vicente Rossello Jaume commented on MYFACES-4766:
-------------------------------------------------
I can propose a solution with whatever option you find optimal
> 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)