不知道这里有没有高人帮忙解决我的项目是,webservice作为OSGi的一个Bundle 发布服务,
然后在另外一个OSGi的bundle中要调用这个webservice,
在client端 运用AXIS2 生成Stub,这些都没问题
问题在于 生成stub后 loadclass载入编译好的类
并且根据类的构造函数来生成对象并且操作
String locatorClassName = "stubs." + targetIfcName + "Stub";
// load AWSMreviewer stub
Class locatorClass;
// load the service locator stub class
locatorClass = Class.forName(locatorClassName);
// return locatorClass.newInstance(); Class[] c = new Class[1];
c[0] = String.class;
// create Instance
Constructor cs = locatorClass
    .getDeclaredConstructor(new Class[] { String.class });// 构造方法
Object object = cs.newInstance(new Object[] { targetWsdl });问题出在红色部分
错误如下
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at awsm.services.AWSMFactory.adapt(AWSMFactory.java:794)
at awsm.services.GenericFactoryServiceImpl.adapt(GenericFactoryServiceImpl.java:149)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:194)
at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:102)
at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:170)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275)
at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:134)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.ops4j.pax.web.service.internal.HttpServiceServletHandler.handle(HttpServiceServletHandler.java:66)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
at org.ops4j.pax.web.service.internal.HttpServiceContext.handle(HttpServiceContext.java:107)
at org.ops4j.pax.web.service.internal.JettyServerHandlerCollection.handle(JettyServerHandlerCollection.java:64)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:324)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
Caused by: javax.xml.stream.FactoryConfigurationError: Requested factory com.ctc.wstx.stax.WstxInputFactory cannot be located.  Classloader =BundleClassLoader{bundle=initial@reference:file:system-bundles/org.apache.axis2.osgi-SNAPSHOT.jar/ [191],parent=null}
at javax.xml.stream.FactoryLocator.loadFactory(FactoryLocator.java:120)
at javax.xml.stream.FactoryLocator.locate(FactoryLocator.java:109)
at javax.xml.stream.FactoryLocator.locate(FactoryLocator.java:54)
at javax.xml.stream.XMLInputFactory.newInstance(XMLInputFactory.java:41)
at org.apache.axiom.om.util.StAXUtils$7.run(StAXUtils.java:311)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.axiom.om.util.StAXUtils.getXMLInputFactory_perClassLoader(StAXUtils.java:306)
at org.apache.axiom.om.util.StAXUtils.getXMLInputFactory(StAXUtils.java:76)
at org.apache.axiom.om.util.StAXUtils.createXMLStreamReader(StAXUtils.java:131)
at org.apache.axis2.util.XMLUtils.toOM(XMLUtils.java:596)
at org.apache.axis2.util.XMLUtils.toOM(XMLUtils.java:581)
at org.apache.axis2.deployment.DescriptionBuilder.buildOM(DescriptionBuilder.java:97)
at org.apache.axis2.deployment.AxisConfigBuilder.populateConfig(AxisConfigBuilder.java:86)
at org.apache.axis2.deployment.DeploymentEngine.populateAxisConfiguration(DeploymentEngine.java:641)
at org.apache.axis2.deployment.FileSystemConfigurator.getAxisConfiguration(FileSystemConfigurator.java:116)
at org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContext(ConfigurationContextFactory.java:68)
at org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContextFromFileSystem(ConfigurationContextFactory.java:184)
at org.apache.axis2.client.ServiceClient.configureServiceClient(ServiceClient.java:150)
at org.apache.axis2.client.ServiceClient.<init>(ServiceClient.java:143)
at stubs.AWSMReviewerStub.<init>(AWSMReviewerStub.java:247)
at stubs.AWSMReviewerStub.<init>(AWSMReviewerStub.java:233)
at stubs.AWSMReviewerStub.<init>(AWSMReviewerStub.java:284)
... 35 more
请求高人指点
Caused by: javax.xml.stream.FactoryConfigurationError: Requested factory com.ctc.wstx.stax.WstxInputFactory cannot be located.  Classloader =BundleClassLoader{bundle=initial@reference:file:system-bundles/org.apache.axis2.osgi-SNAPSHOT.jar/ [191],parent=null}

解决方案 »

  1.   

    此贴聊以慰藉几年前受伤的心吧。内容仅供参考。OSGi 使用Bundle来管理模块,每个Bundle都有自己的ClassLoader,当一个Bundle引用另一个Bundle的类时,如果引用的类会动态加载类时往往会出现类找不到异常。解决办法是在出现问题的地方用类默认的ClassLoader作为线程当前的类加载器,调用结束后在切换回去。 //Object[] result = result = client.invokeBlocking(qname, opEntryArgs, new Class[] {String.class});
    Object[] result = null;
    Thread thread = Thread.currentThread();
    ClassLoader loader = thread.getContextClassLoader();
    thread.setContextClassLoader(this.getClass().getClassLoader());
    try {
    result = client.invokeBlocking(qname, opEntryArgs, new Class[] {String.class});
    } finally {
      thread.setContextClassLoader(loader);
    }