[ https://issues.apache.org/jira/browse/OWB-1442?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Chris Wells updated OWB-1442: ----------------------------- Reporter: Markus Jung (was: Markus Jung) > 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 > Priority: Major > Labels: pull-request-available > > 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)