IncompatibleClassChangeError при оценке выражений xpath с пространством имен - PullRequest
0 голосов
/ 16 ноября 2011

Мне нужно изменить XML-документ, который имеет несколько пространств имен.мой код работает без проблем на моей локальной машине, но я сталкиваюсь с java.lang.IncompatibleClassChangeError при развертывании его на сервере приложений IBM Websphere.

Я использую xercesImpl-2.8.1.jar и xalan-2.7.0.jar.что вызывает эту ошибку и как мне ее устранить?В качестве альтернативы, есть ли другие способы изменить документы XML с поддержкой пространства имен?

Код:

System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
org.w3c.dom.Document doc = db.parse(new java.io.FileInputStream("c:/test.xml"));

System.setProperty("javax.xml.xpath.XPathFactory", "org.apache.xpath.jaxp.XPathFactoryImpl");
XPathFactory xf = XPathFactory.newInstance();
XPath xpath = xf.newXPath();
xpath.setNamespaceContext(new MyNamespaceContext());

// get the node for editing
String xpathExpr = ...
org.w3c.dom.Node n = (org.w3c.dom.Node)xpath.compile(xpathExpr).evaluate(doc, XPathConstants.NODE); // IncompatibleClassChangeError here

трассировка стека исключений:

java.lang.IncompatibleClassChangeError
        at org.apache.xpath.jaxp.JAXPPrefixResolver.getNamespaceForPrefix(JAXPPrefixResolver.java:45)
        at org.apache.xpath.compiler.Lexer.mapNSTokens(Lexer.java:587)
        at org.apache.xpath.compiler.Lexer.tokenize(Lexer.java:265)
        at org.apache.xpath.compiler.Lexer.tokenize(Lexer.java:96)
        at org.apache.xpath.compiler.XPathParser.initXPath(XPathParser.java:110)
        at org.apache.xpath.XPath.<init>(XPath.java:176)
        at org.apache.xpath.XPath.<init>(XPath.java:264)
        at org.apache.xpath.jaxp.XPathImpl.compile(XPathImpl.java:394)
        at com.ibm._jsp._xml._jspService(_xml.java:94)
        at com.ibm.ws.jsp.runtime.HttpJspBase.service(HttpJspBase.java:87)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1146)
        at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:592)
        at com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:525)
        at com.ibm.wsspi.webcontainer.servlet.GenericServletWrapper.handleRequest(GenericServletWrapper.java:122)
        at com.ibm.ws.jsp.webcontainerext.AbstractJSPExtensionServletWrapper.handleRequest(AbstractJSPExtensionServletWrapper.java:232)
        at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3548)
        at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:269)
        at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:831)
        at com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1478)
        at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:133)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:458)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:387)
        at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:267)
        at com.ibm.ws.ssl.channel.impl.SSLConnectionLink.determineNextChannel(SSLConnectionLink.java:1037)
        at com.ibm.ws.ssl.channel.impl.SSLConnectionLink$MyReadCompletedCallback.complete(SSLConnectionLink.java:644)
        at com.ibm.ws.ssl.channel.impl.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1818)
        at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
        at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
        at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
        at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:136)
        at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:196)
        at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:751)
        at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:881)
        at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1497)

Ответы [ 3 ]

2 голосов
/ 16 ноября 2011

Мое обычное эмпирическое правило заключается в том, что IncompatibleClassChangeError означает, что версия некоторого класса, которую видел компилятор во время компиляции, несовместима с версией того же класса, который загружается во время выполнения.Трассировка стека показывает, что ядро ​​XPath выполняет обратный вызов вашего NamespaceResolver, поэтому следует сосредоточиться на расследовании.

0 голосов
/ 25 ноября 2011

мне удалось решить это. это было связано с загрузкой файла класса (javax.xml.namespace.NamespaceContext) из xml-apis.jar, который я также использовал.

javax.xml.namespace.NamespaceContext - это интерфейс, присутствующий в xml-apis.jar и JRE. в версии класса JRE все методы интерфейса помечены как «абстрактные», но в версии xml-apis.jar методы интерфейса не являются абстрактными. я считаю, что это вызвало проблему двоичной совместимости, что привело к ошибке, с которой я столкнулся.

, чтобы решить мою проблему, я изменил конфигурацию загрузчика классов, чтобы использовать родительский загрузчик классов перед загрузчиком классов приложения, чтобы использовать javax.xml.namespace.NamespaceContext из JRE.

0 голосов
/ 16 ноября 2011

Я полагаю, что у websphere есть копия другой версии xerces или xalan в общем пути к классам, и ваше приложение в конечном итоге использует смесь разных версий.Сначала я бы попытался выяснить, какая версия используется веб-сферой и работает ли с ней ваше приложение.

Если вы работаете на Java 6, вы также можете попробовать использовать методы newInstance , принимаяимя класса и загрузчик классов и передать ваши веб-приложения контекстный загрузчик классов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...