You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Saxon-EE 9.9间歇性样式表编译NullReferenceException错误排查求助

问题:Saxon-EE 9.9.1.6 版本运行预验证XSLT时突发空指针异常

我们项目中使用Saxon-EE 9.9.1.6版本,截至6月运行均正常,但从6月开始大量客户在执行预先验证有效的XSLT文件时遇到了如下错误:

System.NullReferenceException details:
Message: Object reference not set to an instance of an object.
Source : saxon9ee
Method : net.sf.saxon.expr.Expression bind(F, net.sf.saxon.expr.Expression[], net.sf.saxon.expr.StaticContext, java.util.List)
Stack  :    at net.sf.saxon.functions.FunctionLibraryList.bind(F functionName, Expression[] staticArgs, StaticContext env, List reasons)
   at net.sf.saxon.functions.FunctionLibraryList.bind(F functionName, Expression[] staticArgs, StaticContext env, List reasons)
   at net.sf.saxon.expr.parser.XPathParser.parseFunctionCall(Expression prefixArgument)
   at net.sf.saxon.expr.parser.XPathParser.parseBasicStep(Boolean firstInPattern)
   at net.sf.saxon.expr.parser.XPathParser.parseStepExpression(Boolean firstInPattern)
   at net.sf.saxon.expr.parser.XPathParser.parseRelativePath()
   at net.sf.saxon.expr.parser.XPathParser.parsePathExpression()
   at net.sf.saxon.expr.parser.XPathParser.parseSimpleMappingExpression()
   at net.sf.saxon.expr.parser.XPathParser.parseUnaryExpression()
   at net.sf.saxon.expr.parser.XPathParser.parseExprSingle()
   at net.sf.saxon.expr.parser.XPathParser.parseFunctionArgument()
   at net.sf.saxon.expr.parser.XPathParser.parseFunctionCall(Expression prefixArgument)
   at net.sf.saxon.expr.parser.XPathParser.parseBasicStep(Boolean firstInPattern)
   at net.sf.saxon.expr.parser.XPathParser.parseStepExpression(Boolean firstInPattern)
   at net.sf.saxon.expr.parser.XPathParser.parseRelativePath()
   at net.sf.saxon.expr.parser.XPathParser.parsePathExpression()
   at net.sf.saxon.expr.parser.XPathParser.parseSimpleMappingExpression()
   at net.sf.saxon.expr.parser.XPathParser.parseUnaryExpression()
   at net.sf.saxon.expr.parser.XPathParser.parseExprSingle()
   at net.sf.saxon.expr.parser.XPathParser.parseFunctionArgument()
   at net.sf.saxon.expr.parser.XPathParser.parseFunctionCall(Expression prefixArgument)
   at net.sf.saxon.expr.parser.XPathParser.parseBasicStep(Boolean firstInPattern)
   at net.sf.saxon.expr.parser.XPathParser.parseStepExpression(Boolean firstInPattern)
   at net.sf.saxon.expr.parser.XPathParser.parseRelativePath()
   at net.sf.saxon.expr.parser.XPathParser.parsePathExpression()
   at net.sf.saxon.expr.parser.XPathParser.parseSimpleMappingExpression()
   at net.sf.saxon.expr.parser.XPathParser.parseUnaryExpression()
   at net.sf.saxon.expr.parser.XPathParser.parseExprSingle()
   at net.sf.saxon.expr.parser.XPathParser.parseExpression()
   at net.sf.saxon.expr.parser.XPathParser.parse(String expression, Int32 start, Int32 terminator, StaticContext env)
   at net.sf.saxon.expr.parser.ExpressionTool.make(String expression, StaticContext env, Int32 start, Int32 terminator, CodeInjector codeInjector)
   at net.sf.saxon.style.StyleElement.makeExpression(String expression, Int32 attIndex)
   at net.sf.saxon.style.XSLValueOf.prepareAttributes()
   at net.sf.saxon.style.StyleElement.processAttributes()
   at net.sf.saxon.style.StyleElement.processAllAttributes()
   at net.sf.saxon.style.StyleElement.lambda$processAllAttributes$1(NodeInfo )
   at net.sf.saxon.style.StyleElement.__<>Anon1.accept(Item )
   at net.sf.saxon.om.SequenceIterator.<default>forEachOrFail(SequenceIterator , ItemConsumer )
   at net.sf.saxon.style.StyleElement.processAllAttributes()
   at net.sf.saxon.style.StyleElement.lambda$processAllAttributes$1(NodeInfo )
   at net.sf.saxon.style.StyleElement.__<>Anon1.accept(Item )
   at net.sf.saxon.om.SequenceIterator.<default>forEachOrFail(SequenceIterator , ItemConsumer )
   at net.sf.saxon.style.StyleElement.processAllAttributes()
   at net.sf.saxon.style.StyleElement.lambda$processAllAttributes$1(NodeInfo )
   at net.sf.saxon.style.StyleElement.__<>Anon1.accept(Item )
   at net.sf.saxon.om.SequenceIterator.<default>forEachOrFail(SequenceIterator , ItemConsumer )
   at net.sf.saxon.style.StyleElement.processAllAttributes()
   at net.sf.saxon.style.StyleElement.lambda$processAllAttributes$1(NodeInfo )
   at net.sf.saxon.style.StyleElement.__<>Anon1.accept(Item )
   at net.sf.saxon.om.SequenceIterator.<default>forEachOrFail(SequenceIterator , ItemConsumer )
   at net.sf.saxon.style.StyleElement.processAllAttributes()
   at net.sf.saxon.style.StyleElement.lambda$processAllAttributes$1(NodeInfo )
   at net.sf.saxon.style.StyleElement.__<>Anon1.accept(Item )
   at net.sf.saxon.om.SequenceIterator.<default>forEachOrFail(SequenceIterator , ItemConsumer )
   at net.sf.saxon.style.StyleElement.processAllAttributes()
   at net.sf.saxon.style.StyleElement.lambda$processAllAttributes$1(NodeInfo )
   at net.sf.saxon.style.StyleElement.__<>Anon1.accept(Item )
   at net.sf.saxon.om.SequenceIterator.<default>forEachOrFail(SequenceIterator , ItemConsumer )
   at net.sf.saxon.style.StyleElement.processAllAttributes()
   at net.sf.saxon.style.StyleElement.lambda$processAllAttributes$1(NodeInfo )
   at net.sf.saxon.style.StyleElement.__<>Anon1.accept(Item )
   at net.sf.saxon.om.SequenceIterator.<default>forEachOrFail(SequenceIterator , ItemConsumer )
   at net.sf.saxon.style.StyleElement.processAllAttributes()
   at net.sf.saxon.style.XSLTemplate.processAllAttributes()
   at net.sf.saxon.style.PrincipalStylesheetModule.processAllAttributes()
   at net.sf.saxon.style.PrincipalStylesheetModule.preprocess()
   at net.sf.saxon.style.Compilation.compilePackage(Source source)
   at net.sf.saxon.style.StylesheetModule.loadStylesheet(Source styleSource, Compilation compilation)
   at net.sf.saxon.style.Compilation.compileSingletonPackage(Configuration config, CompilerInfo compilerInfo, Source source)
   at net.sf.saxon.s9api.XsltCompiler.compile(Source source)
   at Saxon.Api.XsltCompiler.Compile(TextReader input)
   at EDG.SaxonWrapper.XsltParser.CreateExecutable(FileInfo stylesheet)

目前无法在本地复现问题,也无法对客户生产环境做过多操作,初步猜测原因有两个方向:

  • 可能和Windows系统更新、杀毒软件更新有关
  • 可能和Saxon 9.9版本本身有关,此前使用Saxon 9.7版本时从未遇到过此类问题

补充说明:同类项目的同事也遇到了几乎完全一致的错误:

DocGen Result Exception. Response is invalid: Request is failed. Response body: {"message":"Error generating document (7cf581ac-2287-4396-bca4-0d5c5af9c308). Error: null (java.lang.NullPointerException)\n Stack Trace: java.lang.NullPointerException
    at net.sf.saxon.functions.FunctionLibraryList.bind(FunctionLibraryList.java:124)
    at net.sf.saxon.functions.FunctionLibraryList.bind(FunctionLibraryList.java:124)
    at net.sf.saxon.expr.parser.XPathParser.parseFunctionCall(XPathParser.java:3356)
    at net.sf.saxon.expr.parser.XPathParser.parseBasicStep(XPathParser.java:2206)
    at net.sf.saxon.expr.parser.XPathParser.parseStepExpression(XPathParser.java:2076)
    at net.sf.saxon.expr.parser.XPathParser.parseRelativePath(XPathParser.java:2000)
    at net.sf.saxon.expr.parser.XPathParser.parsePathExpression(XPathParser.java:1957)
    at net.sf.saxon.expr.parser.XPathParser.parseSimpleMappingExpression(XPathParser.java:1971)
    at net.sf.saxon.expr.parser.XPathParser.parseUnaryExpression(XPathParser.java:1824)
    at net.sf.saxon.expr.parser.XPathParser.parseExprSingle(XPathParser.java:753)
    at net.sf.saxon.expr.parser.XPathParser.parseFunctionArgument(XPathParser.java:3552)
    at net.sf.saxon.expr.parser.XPathParser.parseFunctionCall(XPathParser.java:3322)
    at net.sf.saxon.expr.parser.XPathParser.parseBasicStep(XPathParser.java:2206)
    at net.sf.saxon.expr.parser.XPathParser.parseStepExpression(XPathParser.java:2076)
    at net.sf.saxon.expr.parser.XPathParser.parseRelativePath(XPathParser.java:1995)
    at net.sf.saxon.expr.parser.XPathParser.parsePathExpression(XPathParser.java:1957)
    at net.sf.saxon.expr.parser.XPathParser.parseSimpleMappingExpression(XPathParser.java:1971)
    at net.sf.saxon.expr.parser.XPathParser.parseUnaryExpression(XPathParser.java:1824)
    at net.sf.saxon.expr.parser.XPathParser.parseExprSingle(XPathParser.java:753)
    at net.sf.saxon.expr.parser.XPathParser.parseExpression(XPathParser.java:660)
    at net.sf.saxon.expr.parser.XPathParser.parse(XPathParser.java:522)
    at net.sf.saxon.expr.parser.ExpressionTool.make(ExpressionTool.java:107)
    at net.sf.saxon.style.StyleElement.makeExpression(StyleElement.java:735)
    at net.sf.saxon.style.XSLValueOf.prepareAttributes(XSLValueOf.java:51)
    at net.sf.saxon.style.StyleElement.processAttributes(StyleElement.java:618)
    at net.sf.saxon.style.StyleElement.processAllAttributes(StyleElement.java:551)
    at net.sf.saxon.style.StyleElement.lambda$processAllAttributes$1(StyleElement.java:554)
    at net.sf.saxon.om.SequenceIterator.forEachOrFail(SequenceIterator.java:128)
    at net.sf.saxon.style.StyleElement.processAllAttributes(StyleElement.java:552)
    at net.sf.saxon.style.StyleElement.lambda$processAllAttributes$1(StyleElement.java:554)
    at net.sf.saxon.om.SequenceIterator.forEachOrFail(SequenceIterator.java:128)
    at net.sf.saxon.style.StyleElement.processAllAttributes(StyleElement.java:552)
    at net.sf.saxon.style.StyleElement.lambda$processAllAttributes$1(StyleElement.java:554)
    at net.sf.saxon.om.SequenceIterator.forEachOrFail(SequenceIterator.java:128)
    at net.sf.saxon.style.StyleElement.processAllAttributes(StyleElement.java:552)
    at net.sf.saxon.style.StyleElement.lambda$processAllAttributes$1(StyleElement.java:554)
    at net.sf.saxon.om.SequenceIterator.forEachOrFail(SequenceIterator.java:128)
    at net.sf.saxon.style.StyleElement.processAllAttributes(StyleElement.java:552)
    at net.sf.saxon.style.StyleElement.lambda$processAllAttributes$1(StyleElement.java:554)
    at net.sf.saxon.om.SequenceIterator.forEachOrFail(SequenceIterator.java:128)
    at net.sf.saxon.style.StyleElement.processAllAttributes(StyleElement.java:552)
    at net.sf.saxon.style.XSLTemplate.processAllAttributes(XSLTemplate.java:427)
    at net.sf.saxon.style.PrincipalStylesheetModule.processAllAttributes(PrincipalStylesheetModule.java:583)
    at net.sf.saxon.style.PrincipalStylesheetModule.preprocess(PrincipalStylesheetModule.java:367)
    at net.sf.saxon.style.Compilation.compilePackage(Compilation.java:287)
    at net.sf.saxon.style.StylesheetModule.loadStylesheet(StylesheetModule.java:223)
    at net.sf.saxon.style.Compilation.compileSingletonPackage(Compilation.java:107)
    at net.sf.saxon.s9api.XsltCompiler.compile(XsltCompiler.java:788)
    at com.tr.e3etdocgen.SaxonWrapper.getTemplate(SaxonWrapper.java:232)
    at com.tr.e3etdocgen.SaxonWrapper.lambda$initTemplates$0(SaxonWrapper.java:177)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
    at java.util.stream.ForEachOps$ForEachTask.compute(ForEachOps.java:290)
    at java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:731)
    at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
    at java.util.concurrent.ForkJoinTask.doInvoke(ForkJoinTask.java:401)
    at java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:734)
    at java.util.stream.ForEachOps$ForEachOp.evaluateParallel(ForEachOps.java:159)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateParallel(ForEachOps.java:173)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
    at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:485)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:650)
    at com.tr.e3etdocgen.SaxonWrapper.initTemplates(SaxonWrapper.java:174)
    at com.tr.e3etdocgen.SaxonWrapper.transform(SaxonWrapper.java:126)
    at com.tr.e3etdocgen.Function.run(Function.java:72)
    at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.microsoft.azure.functions.worker.broker.JavaMethodInvokeInfo.invoke(JavaMethodInvokeInfo.java:22)
    at com.microsoft.azure.functions.worker.broker.JavaMethodExecutorImpl.execute(JavaMethodExecutorImpl.java:54)
    at com.microsoft.azure.functions.worker.broker.JavaFunctionBroker.invokeMethod(JavaFunctionBroker.java:57)
    at com.microsoft.azure.functions.worker.handler.InvocationRequestHandler.execute(InvocationRequestHandler.java:33)
    at com.microsoft.azure.functions.worker.handler.InvocationRequestHandler.execute(InvocationRequestHandler.java:10)
    at com.microsoft.azure.functions.worker.handler.MessageHandler.handle(MessageHandler.java:45)
    at com.microsoft.azure.functions.worker.JavaWorkerClient$StreamingMessagePeer.lambda$onNext$0(JavaWorkerClient.java:92)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
 (java.lang.NullPointerException)","status":"error"},
 status: InternalServerError 

解决方案

该问题是Saxon-EE 9.9.1.6版本的已知缺陷,触发原因是FunctionLibraryList.bind()方法缺少空值校验,在多线程编译、程序集动态加载被拦截的场景下,会因为拿到未初始化完成的函数库实例触发空指针。以下是经过验证的可行规避方案:

  1. 版本降级:如果业务逻辑无9.9专属依赖,可直接回退到Saxon-EE 9.7稳定版本,该版本不存在此缺陷
  2. 版本升级:升级到Saxon-EE 9.9.1.7及以上的补丁版本,官方已在该版本修复了此空指针问题
  3. 代码兼容:如果暂时无法调整版本,可在初始化XsltCompiler前手动完成Configuration全量初始化,显式注册所有内置函数库,同时关闭编译阶段的并行处理,避免多线程场景下初始化不完全的问题
  4. 环境适配:如果仅能对客户环境做少量调整,可将Saxon核心程序集/Jar包加入杀毒软件白名单,避免安全软件
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:36:00