I had this problem when converting from ComponentManager to ServiceManager. Adding Component to the implements clause of my class solved the problem.
Ralph -----Original Message----- From: Joerg Buchberger [mailto:[EMAIL PROTECTED] Sent: Monday, January 12, 2004 4:12 AM To: [EMAIL PROTECTED] Subject: howto properly use ServiceManager.lookup(ROLE) Hi there. Using Sun-JDK-1.4.1_03(WinNT4SP6a), Phoenix-4.0.3, ServiceManager.lookup(MyComponent.ROLE): The ServiceManager always returns a $Proxy<number> type object, which causes a ClassCastException when I try to cast to my components service interface: MyComponent mytest = (MyComponent) ServiceManager.lookup(MyComponent.ROLE); When getting a needed component with ServiceManager, am I supposed to use reflection to get at my services interface/impl(?!), or should the returned object be castable as I tried above? Actually, reflection even tells me that MyComponent-interface is implemented by the returned mytest. ?! I'm somehow lost here. Does anyone see or can anyone guess the mistake? Cheers, Joerg. p.s. Relevant parts of my assembly.xml, MyComponentImpl and qdox-generated MyComponent.xinfo, WebServer.xinfo look like shown in snippets below. Plus test-Servlet code and logging-output for further infos at the end. <assembly> <block name="webserver" class="de.jb.WebServer" > <provide name="test" role="de.jb.compo.MyComponent"/> </block> <block name="test" class="de.jb.compo.MyComponentImpl" > </block> </assembly> /** **************************************************************************** * @phoenix:block * @phoenix:service name="de.jb.compo.MyComponent" */ public class MyComponentImpl implements MyComponent <blockinfo> <!-- section to describe block --> <block> <version>1.0</version> </block> <!-- services that are offered by this block --> <services> <service name="de.jb.WebServer"/> </services> <!-- interfaces that may be exported to manange this block --> <management-access-points> </management-access-points> <!-- services that are required by this block --> <dependencies> <dependency> <service name="de.jb.compo.MyComponent"/> </dependency> </dependencies> </blockinfo> <blockinfo> <!-- section to describe block --> <block> <version>1.0</version> </block> <!-- services that are offered by this block --> <services> <service name="de.jb.compo.MyComponent"/> </services> <!-- interfaces that may be exported to manange this block --> <management-access-points> </management-access-points> <!-- services that are required by this block --> <dependencies> </dependencies> </blockinfo> My servlet executes this code: if (serviceManagerInst.hasService(MyComponent.ROLE)) { Object test = serviceManagerInst.lookup(MyComponent.ROLE); Class[] ac; Method[] am; ac = test.getClass().getInterfaces(); for (int i = 0; i < ac.length; i++) { Class clazz = ac[i]; loggerInst.debug("iface "+ clazz.getName()); } am = test.getClass().getMethods(); for (int i = 0; i < am.length; i++) { Method meth = am[i]; loggerInst.debug("metho "+ meth.getName()); } loggerInst.debug(test.getClass().getName()); loggerInst.debug(test.getClass().getPackage().toString()); if (test instanceof MyComponent) { loggerInst.debug("recognized MyComponent"); Results = ((MyComponent) test).doStuff(); } else { loggerInst.debug("why was MyComponent NOT recognized"); } } snippet from mylog.txt: iface de.jb.compo.MyComponent <-- ! iface org.apache.avalon.phoenix.Block metho hashCode metho equals metho toString metho doStuff <-- ! metho isProxyClass metho newProxyInstance metho getProxyClass metho getInvocationHandler metho getClass metho wait metho wait metho wait metho notify metho notifyAll $Proxy0 why was MyComponent NOT recognized --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
