[jboss-dev-forums] [JBoss Microcontainer Development] - Dependency on non-existant bean when trying to create
kabir.khan@jboss.com
do-not-reply at jboss.com
Tue Nov 3 13:11:25 EST 2009
What's wrong with this? Attempting to add the intermediate bean mentioned in http://www.jboss.org/index.html?module=bb&op=viewtopic&t=162791. I found that adding BeanMetaData as a property to a bean seems to cause an unresolved dependency:
| public class ThrowawayTestCase extends MicrocontainerTest
| {
|
| public ThrowawayTestCase(String name)
| {
| super(name);
| }
|
|
| public void testIndirectBean() throws Throwable
| {
| BeanMetaDataBuilder builder = BeanMetaDataBuilder.createBuilder("Bean", MyBean.class.getName());
| BeanMetaData bmd = builder.getBeanMetaData();
|
| builder = BeanMetaDataBuilder.createBuilder("BeanInstaller", MyBeanInstaller.class.getName());
| // builder.addPropertyMetaData("context", builder.createFromContextInject(FromContext.CONTEXT)); //1
| builder.addPropertyMetaData("beanMetaData", builder.createValue(bmd)); //2
| KernelControllerContext ctx = deploy(builder.getBeanMetaData());
| try
| {
| System.out.println("----------> " + ctx.getDependencyInfo().getIDependOn(null));
| MyBeanInstaller myBeanInstaller = assertBean("BeanInstaller", MyBeanInstaller.class);
|
| // MyBean myBean = assertBean("MyBean", MyBean.class);
| // assertNotNull(myBean);
| }
| finally
| {
| undeploy(ctx);
| }
| }
|
| public static class MyBeanInstaller
| {
| KernelControllerContext context;
|
| BeanMetaData beanMetaData;
|
| boolean started;
|
| public BeanMetaData getBeanMetaData()
| {
| return beanMetaData;
| }
|
| public void setBeanMetaData(BeanMetaData beanMetaData)
| {
| this.beanMetaData = beanMetaData;
| }
|
| public KernelControllerContext getContext()
| {
| return context;
| }
|
| public void setContext(KernelControllerContext context)
| {
| this.context = context;
| }
|
| public boolean isStarted()
| {
| return started;
| }
|
| public void start() throws Exception
| {
| //Use context.getController() and beanmetadata to install indirect bean
| }
| }
|
| public static class MyBean
| {
| }
| }
|
The output dependency info is shown as:
| ----------> [AbstractDependencyItem at 5f49d886{name=BeanInstaller dependsOn=Bean whenRequired=Configured dependentState=Installed resolved=false}]
|
Looking at the stack trace of AbstractDependencyItem's constructor it looks like the property value gets visited as well?
| Thread [main] (Suspended (breakpoint at line 78 in AbstractDependencyItem))
| AbstractDependencyItem.<init>(Object, Object, ControllerState, ControllerState) line: 78
| AbstractBeanMetaData.initialVisit(MetaDataVisitor) line: 669
| PreprocessMetaDataVisitor(AbstractMetaDataVisitor).internalInitialVisit(MetaDataVisitorNode) line: 111
| PreprocessMetaDataVisitor(AbstractMetaDataVisitor).initialVisit(MetaDataVisitorNode) line: 74
| AbstractValueMetaData.initialVisit(MetaDataVisitor) line: 116
| PreprocessMetaDataVisitor(AbstractMetaDataVisitor).internalInitialVisit(MetaDataVisitorNode) line: 111
| PreprocessMetaDataVisitor(AbstractMetaDataVisitor).initialVisit(MetaDataVisitorNode) line: 74
| AbstractPropertyMetaData(AbstractFeatureMetaData).initialVisit(MetaDataVisitor) line: 101
| AbstractPropertyMetaData.initialVisit(MetaDataVisitor) line: 287
| PreprocessMetaDataVisitor(AbstractMetaDataVisitor).internalInitialVisit(MetaDataVisitorNode) line: 111
| PreprocessMetaDataVisitor(AbstractMetaDataVisitor).initialVisit(MetaDataVisitorNode) line: 74
| AbstractBeanMetaData(AbstractFeatureMetaData).initialVisit(MetaDataVisitor) line: 101
| AbstractBeanMetaData.initialVisit(MetaDataVisitor) line: 680
| PreprocessMetaDataVisitor.run() line: 53
| AccessController.doPrivileged(PrivilegedAction<T>) line: not available [native method]
| AbstractKernelControllerContext.preprocessMetaData() line: 232
| AbstractKernelControllerContext.setController(Controller) line: 198
| AbstractKernelController(AbstractController).install(ControllerContext, boolean) line: 778
| AbstractKernelController(AbstractController).install(ControllerContext) line: 564
| AbstractKernelController.install(BeanMetaData, Object) line: 107
| AbstractKernelController.install(BeanMetaData) line: 101
| MicrocontainerTestDelegate.deploy(BeanMetaData) line: 329
| ThrowawayTestCase(MicrocontainerTest).deploy(BeanMetaData) line: 358
| ThrowawayTestCase.testIndirectBean() line: 54
|
I'm not sure this is something we should fix, without a better understanding of how the value metadata is visited. I can work around it by creating an intermediate class
| public static class BeanMetaDataWrapper
| {
| private final BeanMetaData beanMetaData;
|
| public BeanMetaDataWrapper(BeanMetaData beanMetaData)
| {
| this.beanMetaData = beanMetaData;
| }
|
| public BeanMetaData getBeanMetaData()
| {
| return beanMetaData;
| }
| }
|
and to set that instead when creating BeanInstaller
| builder.addPropertyMetaData("beanMetaDataWrapper", builder.createValue(wrapper));
|
View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4263782#4263782
Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4263782
More information about the jboss-dev-forums
mailing list