【问题标题】:Nullpointer exception with dom4j on WebsphereWebsphere 上 dom4j 的 Nullpointer 异常
【发布时间】:2014-08-07 13:33:33
【问题描述】:

我使用 RAD 和 websphere 开发 J2EE 应用程序,当我尝试从 DOM4J 库中执行此代码时:

XPath xpathSelector = DocumentHelper.createXPath("//annee[@annee='"+request.getAnnee()+ "']/offre[@nomOffre='"+request.getOffre()+"'"+conditionProfile+"]/produit[@nomProduit='"+request.getProduit()+"']/"+request.getTypeDocument() +"/specificite[@type='"+request.getSpecificite()+"']/*");
List nodes = xpathSelector.selectNodes(doc);

doc 是一个 org.dom4j.Document 对象。

我收到以下错误:

java.lang.NullPointerException
at org.jaxen.util.DescendantAxisIterator.hasNext(DescendantAxisIterator.java:101)
at org.jaxen.expr.DefaultStep.evaluate(DefaultStep.java:152)
at org.jaxen.expr.DefaultLocationPath.evaluate(DefaultLocationPath.java:140)
at org.jaxen.expr.DefaultAbsoluteLocationPath.evaluate(DefaultAbsoluteLocationPath.java:113)
at org.jaxen.expr.DefaultXPathExpr.asList(DefaultXPathExpr.java:102)
at org.jaxen.BaseXPath.selectNodesForContext(BaseXPath.java:674)
at org.jaxen.BaseXPath.selectNodes(BaseXPath.java:213)
at org.dom4j.xpath.DefaultXPath.selectNodes(DefaultXPath.java:132)
at com.probtp.gp.multitarificateur.referentiel.Referentiel.constitueListePDF(Referentiel.java:250)
at com.probtp.gp.multitarificateur.referentiel.Referentiel.invoque(Referentiel.java:208)
at com.probtp.gp.multitarificateur.referentiel.Referentiel.donner_Referentiel(Referentiel.java:489)
at com.probtp.gp.multitarificateur.referentiel.Referentiel.donner_Referentiel(Referentiel.java:460)
at com.probtp.gp.simulateurs.gammemodulaire.GM_FUEModule.traitementNoticeSpecifique(GM_FUEModule.java:596)
at com.probtp.simulateurs.pdf.PdfMULTI.constitueFicheNotice(PdfMULTI.java:806)
at com.probtp.simulateurs.pdf.PdfMULTI.traiterOffre(PdfMULTI.java:525)
at com.probtp.simulateurs.pdf.PdfMULTI.genererMulti(PdfMULTI.java:407)
at com.probtp.simulateurs.pdf.PdfMULTI.constitutionPDF(PdfMULTI.java:307)
at com.probtp.gp.multitarificateur.action.ChargeMultiValidation.redirectDevis(ChargeMultiValidation.java:1433)
at com.probtp.gp.multitarificateur.action.ChargeMultiValidation.execute(ChargeMultiValidation.java:275)
at com.probtp.gp.ActionGP.perform(ActionGP.java:169)
at probtp.web.base.action.PActionBase.performAction(PActionBase.java:194)
at probtp.web.struts.PAction.perform(PAction.java:119)
at org.apache.struts.action.ActionServlet.processActionPerform(ActionServlet.java:1487)
at probtp.web.struts.PActionServlet.process(PActionServlet.java:281)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:557)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1443)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1384)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:131)
at probtp.mesures.web.MesuresFilter.doFilter(MesuresFilter.java:281)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
at com.probtp.web.filter.StatsFilter.doFilter(StatsFilter.java:44)
at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:188)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:116)
at com.ibm.ws.webcontainer.filter.WebAppFilterChain._doFilter(WebAppFilterChain.java:77)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:852)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:785)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:443)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:175)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3610)
at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:274)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:926)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1557)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:173)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:455)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:384)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)
at com.ibm.ws.ssl.channel.impl.SSLReadServiceContext$SSLReadCompletedCallback.complete(SSLReadServiceContext.java:1772)
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:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:202)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:766)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:896)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1527)

这不是编码问题,因为我的队友没有这个问题,我们应该有相同的配置。当我创建一个 EAR 并且我的一位同事在本地部署它时,它可以工作......

我尝试了以下修改但没有成功:

  • 将编译器从 JDK 1.5 更改为 1.6,
  • 尝试其他版本的 DOM4J(目前为 1.6.1),
  • 再次安装我的服务器。

如果您有任何提示,我很乐意进行测试。

提前致谢,JB。

【问题讨论】:

  • 能否请您从堆栈跟踪中发布更多信息?还要检查您的 xml 编码是否与您的队友使用的相同。要检查,请转到 windows > 首选项,在搜索字段中输入编码。有 2 个地方可以检查 XML > XML Files and General > Content Types > Text > XML
  • 您好,这也不是编码问题,因为我创建了一个主类并测试了代码并且它有效,我已经探索了编码问题的可能性,但事实并非如此。我在第一条消息中添加了完整的跟踪信息。
  • 您能否检查一下您是否使用与其他队友相同的类加载器策略?您是否使用与它们相同的 JDK 版本以及相同的操作系统?确实很奇怪,它在 WebSphere 上运行,对你的队友没有错误,对你却不起作用。
  • 我们有相同的 jdk,相同的操作系统。但是我已经按照您从 PARENT_FIRST 到 PARENT_LAST 的建议修改了类加载器策略,并且它有效!如果有人作为解释,那就太好了。谢谢。
  • 嗨,我已经添加了完整的答案和解释。很高兴它现在可以工作了。

标签: java websphere rad dom4j


【解决方案1】:

更改类加载器策略以匹配你的队友配置,有一些关于如何做到这一点的选项,最直接的是更改服务器类加载器:

单击服务器 > 服务器类型 > WebSphere 应用程序服务器 > server_name 以访问应用程序服务器设置页面。 指定应用程序服务器的应用程序类加载器策略。保存并重新启动。

查看有关如何更改类加载器以及您可以采取的其他方法的更多详细信息:

Specify class-loader values for an application server.

Specify class-loader values for an installed enterprise application.

Specify the class-loader mode for an installed web module.

类加载器策略设置为:

首先使用父类加载器加载的类 - 使类加载器首先在父类加载器中搜索以加载一个类。 此值是开发工具包类加载器的标准,并且 WebSphere® Application Server 类加载器。

首先使用本地类加载器加载的类(最后一个父类) - 使类加载器在应用程序类加载器中搜索 首先加载一个类。通过指定使用本地类加载的类 loader first (parent last),你的应用程序可以覆盖类 包含在父类加载器中。

简而言之,这意味着如果您从代码中引用包 com.x.Foo 中的一个类,例如,这个完全相同的类存在于 WebSphere 类加载器中,也存在于您的 WEB-INF/lib 中的一个打包库中如果您使用默认的“父级优先”文件夹,则类加载器将找到并使用 WebSphere 版本,因为它会首先找到它,另一方面,如果您将其更改为“最后一个父级”,它将首先找到您的库版本,然后改为使用它。 请查看官方IBM WebSphere infocenter 页面,了解在哪里可以找到完整的详细说明。

【讨论】:

  • 感谢您的帮助和解释,我被困了好几天!
猜你喜欢
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2014-01-31
  • 2011-09-11
相关资源
最近更新 更多