[jboss-user] [Microcontainer] - Conflict between ejb3 deployer and custom GenericAnnotationD

gregory.mostizky@gmail.com do-not-reply at jboss.com
Mon May 4 04:03:44 EDT 2009


Using JBoss AS 5.0.1 GA

I am trying to write custom deployer that will scan classes for annotation during POST_CLASSLOADING phase, save the found classes into metadata and then use that to perform some extra steps during REAL phase (similar to WS stuff but for QMF protocol).

I have a test enviroment with sample EJB3 app and a custom deployer. However when I start JBoss I get the following exception:



  | 10:59:20,213 ERROR [AbstractKernelController] Error installing to Real: name=vfszip:/home/gmostizk/java/jboss-5.0.1.GA/server/default/deploy/vdcServer-0.0.1-SNAPSHOT.ear/ state=PreReal mode=Manual requiredState=Real
  | org.jboss.deployers.spi.DeploymentException: Error deploying vdcServer-0.0.1-SNAPSHOT.ear: Container jboss.j2ee:ear=vdcServer-0.0.1-SNAPSHOT.ear,jar=vdcServer-0.0.1-SNAPSHOT.ear,name=ConfigManagerBean,service=EJB3 failed to resolve persistence unit null
  | 	at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:201)
  | 	at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:103)
  | 	at org.jboss.deployers.vfs.spi.deployer.AbstractVFSRealDeployer.internalDeploy(AbstractVFSRealDeployer.java:45)
  | 	at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
  | 	at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
  | 	at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
  | 	at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
  | 	at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
  | 	at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
  | 	at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1598)
  | 	at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
  | 	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1062)
  | 	at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
  | 	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
  | 	at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
  | 	at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
  | 	at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:698)
  | 	at org.jboss.system.server.profileservice.ProfileServiceBootstrap.loadProfile(ProfileServiceBootstrap.java:304)
  | 	at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:205)
  | 	at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:405)
  | 	at org.jboss.Main.boot(Main.java:209)
  | 	at org.jboss.Main$1.run(Main.java:547)
  | 	at java.lang.Thread.run(Thread.java:619)
  | Caused by: java.lang.IllegalArgumentException: Container jboss.j2ee:ear=vdcServer-0.0.1-SNAPSHOT.ear,jar=vdcServer-0.0.1-SNAPSHOT.ear,name=ConfigManagerBean,service=EJB3 failed to resolve persistence unit null
  | 	at org.jboss.injection.PersistenceUnitHandler.addPUDependency(PersistenceUnitHandler.java:135)
  | 	at org.jboss.injection.PersistenceContextHandler.loadXml(PersistenceContextHandler.java:76)
  | 	at org.jboss.ejb3.EJBContainer.processMetadata(EJBContainer.java:588)
  | 	at org.jboss.ejb3.Ejb3Deployment.processEJBContainerMetadata(Ejb3Deployment.java:415)
  | 	at org.jboss.ejb3.Ejb3Deployment.start(Ejb3Deployment.java:523)
  | 	at org.jboss.ejb3.deployers.Ejb3Deployer.deploy(Ejb3Deployer.java:194)
  | 	... 22 more
  | Caused by: java.lang.IllegalArgumentException: Can't find a persistence unit named 'null' in AbstractVFSDeploymentContext at 5463591{vfszip:/home/gmostizk/java/jboss-5.0.1.GA/server/default/deploy/vdcServer-0.0.1-SNAPSHOT.ear/}
  | 	at org.jboss.jpa.resolvers.BasePersistenceUnitDependencyResolver.resolvePersistenceUnitSupplier(BasePersistenceUnitDependencyResolver.java:107)
  | 	at org.jboss.ejb3.Ejb3Deployment.resolvePersistenceUnitSupplier(Ejb3Deployment.java:720)
  | 	at org.jboss.ejb3.EJBContainer.resolvePersistenceUnitSupplier(EJBContainer.java:1428)
  | 	at org.jboss.injection.PersistenceUnitHandler.addPUDependency(PersistenceUnitHandler.java:130)
  | 	... 27 more
  | 

The exception thrown during deployment of the sample application.

My custom GenericAnnotationDeployer:

  | public class QmfTypeAnnotationDeployer extends GenericAnnotationDeployer {
  |     @Override
  |     protected void visitModule(DeploymentUnit deploymentUnit, Module module, GenericAnnotationResourceVisitor genericAnnotationResourceVisitor) {
  |         super.visitModule(deploymentUnit, module, genericAnnotationResourceVisitor);
  | 
  |         AnnotationEnvironment annotationEnvironment = genericAnnotationResourceVisitor.getEnv();
  |         Set<Element<QMFSeeAlso,Class<?>>> qmfSeeAlsoAnnotations = annotationEnvironment.classIsAnnotatedWith(QMFSeeAlso.class);
  | 
  |         QmfRegisteredClassesMetaData metaData = new QmfRegisteredClassesMetaData();
  | 
  |         // create metadata for each class we need to register
  |         for (Element<QMFSeeAlso, Class<?>> qmfSeeAlsoAnnotation : qmfSeeAlsoAnnotations) {
  | 
  |             // add the root class
  |             Class<?> annotatedClass = qmfSeeAlsoAnnotation.getAnnotatedElement();
  |             metaData.add(annotatedClass);
  | 
  |             // add all the children
  |             Class[] subClasses = qmfSeeAlsoAnnotation.getAnnotation().value();
  |             for (Class subClass : subClasses) {
  |                 metaData.add(subClass);
  |             }
  |         }
  | 
  |         // attach metadata to unit
  |         deploymentUnit.addAttachment(QmfRegisteredClassesMetaData.class, metaData);
  |     }
  | }
  | 

REAL phase deployer:

  |     private void registerQmfTypes(DeploymentUnit unit) {
  |         QmfRegisteredClassesMetaData metadata = unit.getAttachment(QmfRegisteredClassesMetaData.class);
  |         if(metadata==null) return;
  | 
  |         for (Class classToRegister : metadata.getAnnotatedClasses()) {
  |             log.info("Exposing "+classToRegister.getSimpleName()+" as QMFType");
  |             qmfAgent.registerClass(classToRegister);
  |         }
  |     }
  | 

jboss-beans.xml

  |     <bean name="QmfServiceDeployerEJB" class="org.jboss.qmf.core.deployers.QmfServiceDeployerEJB">
  |         <depends>EJB2xDeployer</depends>
  |         <depends>Ejb3Deployer</depends>
  | 
  |         <property name="qmfAgent">
  |             <inject bean="QmfAgent" />
  |         </property>
  |     </bean>
  | 
  | 
  |     <bean name="QmfTypeAnnotationDeployer" class="org.jboss.qmf.core.deployers.QmfTypeAnnotationDeployer"/>
  | 

If I comment out the last line from XML everything loads perfectly (without my custom work) so it seems there is some potential conflict between GenericAnnotationDeployer and normal EJB3 deployment process.

I am stuck on this so I would appreciate your help.

Thanks,
Gregory

View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4228225#4228225

Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4228225



More information about the jboss-user mailing list