2010-07-16 149 views
3

当前体系结构有一个Web应用程序(以WAR分布形式),用于通过Servlet向Web客户机提供信息。这个Servlet通过Glassfish Metro(SOAP)从外部服务中获取这些信息,然后为客户端(JavaScript)进行相应的格式化。通过Servlet调用外部Web服务

已经开发了一个代理组件(JAR)来管理对该外部服务的访问(通过Glassfish Metro),并且该组件可以通过命令行,JUnit测试甚至是web项目,当它作为命令行应用程序执行时。

一旦通过Glassfish执行此Web项目,Servlet在尝试调用此服务时(通过代理组件)会遇到问题。

下面是堆栈跟踪:

java.lang.ClassCastException: org.apache.xerces.parsers.XML11Configuration cannot be cast to org.apache.xerces.xni.parser.XMLParserConfiguration 
    at org.apache.xerces.parsers.SAXParser.<init>(Unknown Source) 
    at org.apache.xerces.parsers.SAXParser.<init>(Unknown Source) 
    at org.apache.xerces.jaxp.SAXParserImpl.<init>(Unknown Source) 
    at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParser(Unknown Source) 
    at com.sun.org.apache.xml.internal.resolver.readers.SAXCatalogReader.readCatalog(SAXCatalogReader.java:238) 
    at com.sun.org.apache.xml.internal.resolver.Catalog.parseCatalog(Catalog.java:680) 
    at com.sun.xml.ws.util.xml.XmlUtil.createDefaultCatalogResolver(XmlUtil.java:299) 
    at com.sun.xml.ws.client.WSServiceDelegate.parseWSDL(WSServiceDelegate.java:267) 
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:230) 
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:178) 
    at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:106) 
    at javax.xml.ws.Service.<init>(Service.java:57) 
    at com.acme.MLSWebServicesInterface.<init>(MLSWebServicesInterface.java:48) 
    at com.adomain.acme.MLSManager.getDeviceRecords(MLSManager.java:42) 
    at com.adomain.app.service.StatusManager.getDeviceRecords(StatusManager.java:22) 
    at com.adomain.app.service.StatusServlet.processRequest(StatusServlet.java:44) 
    at com.adomain.app.service.StatusServlet.doGet(StatusServlet.java:87) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:69) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 
    at java.lang.Thread.run(Thread.java:619) 
+0

+1使用“加纳”这个词 – skaffman 2010-07-16 09:55:55

回答

4

这看起来像从多个类加载器加载的类相互矛盾的问题。具体来说,它看起来像你的应用程序在它的lib目录中有Xerces的内部副本,这与Glassfish自己的副本冲突。

如果是这样,从您的应用程序中删除副本,这是不需要的。

+1

就是这样。一旦将它从lib目录中排除,问题就会消失。 – 2010-07-16 10:14:28