2010-07-16 151 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