[ 
https://issues.apache.org/jira/browse/OWB-1465?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated OWB-1465:
--------------------------------
    Labels: pull-request-available  (was: )

> NormalScopeProxyFactory drops the ACC_BRIDGE flag from re-declared bridge 
> methods, breaking EL overload resolution
> ------------------------------------------------------------------------------------------------------------------
>
>                 Key: OWB-1465
>                 URL: https://issues.apache.org/jira/browse/OWB-1465
>             Project: OpenWebBeans
>          Issue Type: Bug
>    Affects Versions: 4.1.0
>            Reporter: Richard Zowalla
>            Priority: Major
>              Labels: pull-request-available
>
> Since bridge methods are materialized on subclass proxies (OWB-1234/OWB-923), 
> {{NormalScopeProxyFactory.delegateNonInterceptedMethods}} re-declares the JVM 
> bridge methods of the proxied class. However, the generated method's 
> modifiers are masked with
> {code:java}
> int targetModifiers = delegatedMethod.getModifiers() & (Modifier.PROTECTED | 
> Modifier.PUBLIC | MODIFIER_VARARGS);
> {code}
> which strips {{ACC_BRIDGE}} (and {{{}ACC_SYNTHETIC{}}}). For a bean 
> implementing a generic interface, e.g.
> {code:java}
> public interface GenericParameterInterface<T extends CustomBaseType> {
>     String consume(T instance);
> }
> public class SpecificParameterClass implements 
> GenericParameterInterface<CustomType> {
>     @Override
>     public String consume(CustomType instance) { ... }
> }
> {code}
> the normal scope proxy ends up exposing *two regular methods* 
> {{consume(CustomType)}} and {{consume(CustomBaseType)}} — on the proxied 
> class itself the latter is flagged as such.
> *Impact:* Expression language implementatio by preferring the non-bridge 
> variant (seeTomcat's {{org.apache.el.util.ReflectionUtil}} / 
> {{{}jakarta.el.Util{}}}, which tie-break via {{{}Method.isBridge(){}}}).
> Against such a proxy both candidates look ling e.g. 
> {{{}#{bean.consume(x){}}}} fails with
> {noformat}
> jakarta.el.MethodNotFoundException: Unable to find unambiguous method: 
> Bean$$OwbNormalScopeProxy0.consume(...)
> {noformat}
> Observed in practice with MyFaces action means implementing generic 
> interfaces (TomEE 11 M4 / OWB 4.1.0). This worked with OWB 4.0.x, which did 
> not re-declare bridge methods on proxies.
> {{InterceptorDecoratorProxyFactory}} is *not* affected: it skips bridge 
> methods entirely ({{{}unproxyableMethod{}}}), so
> the properly flagged bridge is inherited fr
> *Test case* (fails on current master with {second test documents the correct 
> interceptor proxy behaviour):
> [https://github.com/rzo1/openwebbeans/tree/n]
> (commit [3169f8faf|https://github.com/rzo1/openwebbeans/commit/3169f8faf])
> *Suggested fix:* preserve the bridge flag in 
> {{{}NormalScopeProxyFactory.delegateNonInterceptedMethods{}}}, e.g.
> {code:java}
> int targetModifiers = delegatedMethod.getMo
>         & (Modifier.PROTECTED | Modifier.PUBLIC | MODIFIER_VARARGS | 
> MODIFIER_BRIDGE | MODIFIER_SYNTHETIC);
> {code}
> with {{MODIFIER_BRIDGE = 0x0040}} / {{MODIF{{java.lang.reflect.Modifier}} 
> constantsexist for these).



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

Reply via email to