Markus Jung created OWB-1442:
--------------------------------
Summary: Derive AbstractOwbBean returnType from types instead of
beanClass
Key: OWB-1442
URL: https://issues.apache.org/jira/browse/OWB-1442
Project: OpenWebBeans
Issue Type: Improvement
Components: Core
Affects Versions: 4.0.2
Reporter: Markus Jung
AbstractOwbBean#getReturnType() currently defaults to getBeanClass():
[https://github.com/apache/openwebbeans/blob/main/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java#L280]
This works fine for normal managed beans - producer beans override this method
as beanClass is nut suitable there. However there is a third case that probably
isn't handled correctly: Synthetic beans registered with a portable extension.
IMO the spec is ambiguous on what beanClass should mean here.
CDI users tend to register beans with the beanClass pointing to the Extension
that registered this synthetic bean. For example mojarra
[https://github.com/eclipse-ee4j/mojarra/pull/5158]) and soteria
([https://github.com/eclipse-ee4j/soteria/pull/338]) do this. This causes OWB
to proxy the wrong type.
This issue originates from https://issues.apache.org/jira/browse/TOMEE-4355 but
I do believe this is nothing that should be fixed in TomEE. Mojarra is also not
blame here as the spec just is not concise enough. IMO it would greatly benefit
users if OWB would just allow a case like this to exist and proxy the correct
type by resolving it from BeanAttributes#getTypes()
Last but not least, a test says more than 1000 words ;)
{code:java}
public class SyntheticBeanMismatchedBeanClassTest extends AbstractUnitTest {
@Test
public void test() {
addExtension(new MyExtension());
startContainer();
assertTrue(getInstance("myFirstBean") instanceof MyFirstBean);
}
public static class MyExtension implements Extension {
public void afterBeanDiscovery(@Observes AfterBeanDiscovery abd,
BeanManager bm) {
abd.addBean()
.beanClass(MyExtension.class)
.scope(ApplicationScoped.class)
.name("myFirstBean")
.types(bm.createAnnotatedType(MyFirstBean.class).getTypeClosure())
.createWith(ctx -> new MyFirstBean());
}
}
public static class MyFirstBean { }
}
{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)