[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