Uploaded image for project: 'Magnolia'
  1. Magnolia
  2. MAGNOLIA-6518

BeanMerger attempts to proxy final classes (e.g. Locale, Enum etc)

    XMLWordPrintable

Details

    • Bug
    • Resolution: Fixed
    • Blocker
    • 5.4.5
    • 5.4.4
    • None
    • Basel 29
    • 5

    Description

      To reproduce:

      1. Import this: config.modules.multisite.config.sites.travel.variations.xml
      2. Go to Pages - (choose some page from "travel" demo and "Preview" it)
      3. Switch the device from "Desktop" to "Tablet" or "Smartphone"

      Than it reports:

      HTTP Status 500 - Proxy class cannot extend java.util.Locale as it is final.
      
      type: Exception report
      
      message: Proxy class cannot extend java.util.Locale as it is final.
      
      description: The server encountered an internal error that prevented it from fulfilling this request.
      
      exception: 
      org.apache.commons.proxy.exception.ProxyFactoryException: Proxy class cannot extend java.util.Locale as it is final.
      	org.apache.commons.proxy.factory.util.AbstractSubclassingProxyFactory.getSuperclass(AbstractSubclassingProxyFactory.java:134)
      	org.apache.commons.proxy.factory.cglib.CglibProxyFactory.createInvokerProxy(CglibProxyFactory.java:87)
      	org.apache.commons.proxy.ProxyFactory.createInvokerProxy(ProxyFactory.java:145)
      	info.magnolia.beanmerger.ProxyBasedBeanMerger.mergeBean(ProxyBasedBeanMerger.java:83)
      	info.magnolia.beanmerger.BeanMergerBase.merge(BeanMergerBase.java:77)
      	info.magnolia.beanmerger.ProxyBasedBeanMerger$MergeInvoker.invoke(ProxyBasedBeanMerger.java:138)
      	org.apache.commons.proxy.factory.cglib.CglibProxyFactory$InvokerBridge.invoke(CglibProxyFactory.java:116)
      	info.magnolia.cms.i18n.DefaultI18nContentSupport$$EnhancerByCGLIB$$99f0d861.determineLocale(<generated>)
      	info.magnolia.module.site.i18n.SiteI18nContentSupport.determineLocale(SiteI18nContentSupport.java:104)
      	info.magnolia.module.site.i18n.SiteI18nContentSupport$$EnhancerByCGLIB$$b5dc6d0.determineLocale(<generated>)
      	info.magnolia.cms.i18n.I18nContentSupportFilter.doFilter(I18nContentSupportFilter.java:59)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.cms.filters.RangeSupportFilter.doFilter(RangeSupportFilter.java:84)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.cms.security.BaseSecurityFilter.doFilter(BaseSecurityFilter.java:57)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.multisite.filters.CrossSiteSecurityFilter.doFilter(CrossSiteSecurityFilter.java:105)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
      	info.magnolia.cms.security.SecurityCallbackFilter.doFilter(SecurityCallbackFilter.java:80)
      	info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.cms.security.LogoutFilter.doFilter(LogoutFilter.java:94)
      	info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.module.site.filters.SiteMergeFilter.doFilter(SiteMergeFilter.java:119)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.multisite.filters.MultiSiteFilter.doFilter(MultiSiteFilter.java:105)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.cms.filters.MultiChannelFilter.doFilter(MultiChannelFilter.java:83)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.module.cache.filter.GZipFilter.doFilter(GZipFilter.java:73)
      	info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
      	info.magnolia.cms.security.auth.login.LoginFilter.doFilter(LoginFilter.java:127)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.enterprise.registration.RegistrationFilter.doFilter(RegistrationFilter.java:64)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
      	info.magnolia.cms.filters.CosMultipartRequestFilter.doFilter(CosMultipartRequestFilter.java:87)
      	info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.personalization.preview.filter.PreviewFilter.doFilter(PreviewFilter.java:92)
      	info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.personalization.trait.AbstractTraitDetectorFilter.doFilter(AbstractTraitDetectorFilter.java:74)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.personalization.trait.AbstractTraitDetectorFilter.doFilter(AbstractTraitDetectorFilter.java:74)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.personalization.trait.AbstractTraitDetectorFilter.doFilter(AbstractTraitDetectorFilter.java:74)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.personalization.trait.AbstractTraitDetectorFilter.doFilter(AbstractTraitDetectorFilter.java:74)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.cms.filters.ContentTypeFilter.doFilter(ContentTypeFilter.java:148)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.cms.filters.ContextFilter.doFilter(ContextFilter.java:128)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
      	info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65)
      	info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
      	info.magnolia.cms.filters.SafeDestroyMgnlFilterWrapper.doFilter(SafeDestroyMgnlFilterWrapper.java:107)
      	info.magnolia.cms.filters.MgnlFilterDispatcher.doDispatch(MgnlFilterDispatcher.java:67)
      	info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:108)
      	info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:94)
      

      If you set the value of enabled to "false" here /server/filters/i18n@enabled, it is OK.

      Cause
      The issue shows up only when there are site variations as in that case the Site configs would be merged at info.magnolia.module.site.filters.SiteMergeFilter.doFilter(..). BeanMerger would then try to proxy java.util.Locale final class which isn't allowed by the underlying proxy library used by Magnolia, https://github.com/cglib/cglib/wiki
      The problem is present at least since 5.4.3.

      Solution
      Obvious solution was to prevent BeanMerger from proxying final classes and interfaces (excluding Java's Map and Collection).

      Checklists

        Acceptance criteria

        Attachments

          Issue Links

            Activity

              People

                fgrilli Federico Grilli
                evystup Ervin Vystup
                Votes:
                2 Vote for this issue
                Watchers:
                4 Start watching this issue

                Dates

                  Created:
                  Updated:
                  Resolved:

                  Checklists

                    Bug DoR
                    Task DoD

                    Time Tracking

                      Estimated:
                      Original Estimate - Not Specified
                      Not Specified
                      Remaining:
                      Remaining Estimate - 0d
                      0d
                      Logged:
                      Time Spent - 6.5h
                      6.5h