Okay, I've seen the recent OWB (or CDI) topics, so I thought I might
introduce a separate thread based on my experience today.
Months ago, I migrated from JSF managed beans to CDI manageds (and migrated
from Glassfish to TomEE/OpenWebBeans), two birds with one stone. During
that migration, I created the following for descendant managed beans in my
app.
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Descendant {}
which allowed me to implement the following ancestor class (for example):
@Default
@Named("pf_addressController")
@SessionScoped
public class pf_AddressController implements Serializable {
and develop descendants, which extend the ancestor as follows (for example):
@Descendant
@Named("pf_hotelAddressController")
@SessionScoped
public class pf_HotelAddressController extends pf_AddressController {
also, I was able to add the following to one of my pf_OrdersController
(which has 'no' descendant classes)
@Inject @Descendant
private pf_OrderCustomerPointOfContactController
orderCustomerPointOfContactController;
Everything mentioned above has worked in production ever since I started
using TomEE (almost 6 months ago).
Today, it was suggested that I use @Typed instead of this user-defined
@Descendant. @Typed seems to work well on/for extending managed bean
ancestors, but I replaced @Descendant (in the code above) with @Typed as
seen below (for bean 'member'):
@Inject @Descendant
private pf_OrderCustomerPointOfContactController
orderCustomerPointOfContactController;
and now, TomEE will not start, because of the following error:
INFO: Adding OpenWebBeansPlugin : [CdiPlugin]
May 20, 2013 8:42:34 AM org.apache.webbeans.plugins.PluginLoader startUp
INFO: Adding OpenWebBeansPlugin : [OpenWebBeansJsfPlugin]
May 20, 2013 8:42:36 AM org.apache.openejb.cdi.OpenEJBLifecycle
startApplication
SEVERE: CDI Beans module deployment failed
javax.enterprise.inject.UnsatisfiedResolutionException: Api type
[jsf.orderCustomerPointOfContact.pf_OrderCustomerPointOfContactController]
is not found with the qualifiers
Qualifiers: [@javax.enterprise.inject.Default()]
for injection into Field Injection Point, field name :
orderCustomerPointOfContactController, Bean Owner : [pf_OrdersController,
Name:pf_ordersController, WebBeans Type:MANAGED, API
Types:[java.io.Serializable,java.lang.Object,jsf.orders.pf_OrdersController],
Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default,javax.inject.Named]]
at
org.apache.webbeans.util.InjectionExceptionUtil.throwUnsatisfiedResolutionException(InjectionExceptionUtil.java:77)
at
org.apache.webbeans.container.InjectionResolver.getInjectionPointBean(InjectionResolver.java:238)
at
org.apache.webbeans.util.WebBeansUtil.isPassivationCapableDependency(WebBeansUtil.java:1573)
at
org.apache.webbeans.config.DeploymentValidationService.validatePassivationCapableDependencies(DeploymentValidationService.java:170)
at
org.apache.webbeans.config.DeploymentValidationService.validatePassivationCapable(DeploymentValidationService.java:127)
at
org.apache.webbeans.config.BeansDeployer.checkPassivationScope(BeansDeployer.java:748)
at org.apache.webbeans.config.BeansDeployer.validate(BeansDeployer.java:428)
at
org.apache.webbeans.config.BeansDeployer.validateInjectionPoints(BeansDeployer.java:390)
at org.apache.webbeans.config.BeansDeployer.deploy(BeansDeployer.java:194)
at
org.apache.openejb.cdi.OpenEJBLifecycle.startApplication(OpenEJBLifecycle.java:182)
at
org.apache.openejb.cdi.ThreadSingletonServiceImpl.initialize(ThreadSingletonServiceImpl.java:158)
at org.apache.openejb.cdi.CdiBuilder.build(CdiBuilder.java:43)
at
org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:793)
at
org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:608)
at
org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:1111)
at
org.apache.tomee.catalina.TomcatWebAppBuilder.configureStart(TomcatWebAppBuilder.java:974)
at
org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:124)
at
org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at
org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5269)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:977)
at
org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1654)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)