Richard Zowalla created OWB-1465:
------------------------------------
Summary: 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
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)