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

多FileDownload控件多次删除后Xpages文档无法保存问题

多组FileUpload/FileDownload控件在OpenNTF Domino库启用时保存失败问题

我开发了一个包含多组FileUpload和支持删除操作的FileDownload控件的XPage,执行以下操作后点击Save按钮会出现保存失败:

  • 为第一个字段添加附件,删除后重新添加附件;
  • 为第二个字段执行同样的添加-删除-重新添加附件操作;
  • 点击Save按钮。

报错提示保存数据源document1时发生异常,底层为NullPointerException,堆栈指向DominoRichTextItem类的updateMultipartRelated方法。经测试,仅使用一组控件时无此问题;排查发现问题与Xsp Properties中启用org.openntf.domino.xsp.XspLibrary库相关。

XPage源码

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom">
    <xp:this.data>
        <xp:dominoDocument var="document1"></xp:dominoDocument>
    </xp:this.data>
    <xp:div id="divFLControl1">
        <xp:label value="Car photo" id="label25"></xp:label>
        <xp:fileUpload id="flUpload1" styleClass="file">
            <xp:this.value><![CDATA[#{document1.photoCar}]]></xp:this.value>
            <xp:this.accept><![CDATA[#{javascript:"image/bmp,image/jpeg,image/png,application/pdf,text/plain,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,video/mpeg,video/x-msvideo,video/mp4,video/x-ms-wmv"}]]></xp:this.accept>
            <xp:eventHandler event="onchange" submit="true" refreshMode="partial" disableValidators="true" refreshId="divFLControl1"></xp:eventHandler>
        </xp:fileUpload>
        <xp:message id="message1" for="flUpload1"></xp:message>
        <xp:fileDownload rows="30" id="fileDownload1" displayLastModified="false" hideWhen="true" styleClass="table table-striped table-hover table-bordered" displayType="false" allowDelete="true">
            <xp:this.value><![CDATA[#{document1.photoCar}]]></xp:this.value>
        </xp:fileDownload>
    </xp:div>
    <xp:div id="divFLControl2">
        <xp:label value="Bus Photo" id="label1"></xp:label>
        <xp:fileUpload id="fileUpload2" styleClass="file" value="#{document1.photoBus}">
            <xp:this.accept><![CDATA[#{javascript:"image/bmp,image/jpeg,image/png,application/pdf,text/plain,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,video/mpeg,video/x-msvideo,video/mp4,video/x-ms-wmv"}]]></xp:this.accept>
            <xp:eventHandler event="onchange" submit="true" refreshMode="partial" disableValidators="true" refreshId="divFLControl2"></xp:eventHandler>
        </xp:fileUpload>
        <xp:message id="message2" for="flUpload2"></xp:message>
        <xp:fileDownload rows="30" id="fileDownload2" displayLastModified="false" hideWhen="true" styleClass="table table-striped table-hover table-bordered" displayType="false" allowDelete="true" value="#{document1.photoBus}">
        </xp:fileDownload>
    </xp:div>

    <xp:button value="Save" id="button1">
        <xp:eventHandler event="onclick" submit="true" refreshMode="complete" immediate="false" save="true"></xp:eventHandler>
    </xp:button>
</xp:view>

报错堆栈信息

Unexpected runtime error
The runtime has encountered an unexpected error.
Error source
Page Name:/claim26.xsp

Exception
Error saving data source document1
▼ Stack Trace
javax.faces.FacesException: Error saving data source document1
    com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:102)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:210)
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:96)
    com.ibm.xsp.controller.FacesControllerImpl.execute(FacesControllerImpl.java:256)
    com.ibm.xsp.webapp.FacesServlet.serviceView(FacesServlet.java:231)
    com.ibm.xsp.webapp.FacesServletEx.serviceView(FacesServletEx.java:157)
    com.ibm.xsp.webapp.FacesServlet.service(FacesServlet.java:163)
    com.ibm.xsp.webapp.FacesServletEx.service(FacesServletEx.java:138)
    com.ibm.xsp.webapp.DesignerFacesServlet.service(DesignerFacesServlet.java:103)
    com.ibm.designer.runtime.domino.adapter.ComponentModule.invokeServlet(ComponentModule.java:600)
    com.ibm.domino.xsp.module.nsf.NSFComponentModule.invokeServlet(NSFComponentModule.java:1352)
    com.ibm.designer.runtime.domino.adapter.ComponentModule$AdapterInvoker.invokeServlet(ComponentModule.java:877)
    com.ibm.designer.runtime.domino.adapter.ComponentModule$ServletInvoker.doService(ComponentModule.java:820)
    com.ibm.designer.runtime.domino.adapter.ComponentModule.doService(ComponentModule.java:589)
    com.ibm.domino.xsp.module.nsf.NSFComponentModule.doService(NSFComponentModule.java:1336)
    com.ibm.domino.xsp.module.nsf.NSFService.doServiceInternal(NSFService.java:725)
    com.ibm.domino.xsp.module.nsf.NSFService.doService(NSFService.java:515)
    com.ibm.designer.runtime.domino.adapter.LCDEnvironment.doService(LCDEnvironment.java:357)
    com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:313)
    com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service(XspCmdManager.java:272)
com.ibm.xsp.FacesExceptionEx: Error saving data source document1
    com.ibm.xsp.util.FacesUtil.save(FacesUtil.java:585)
    com.ibm.xsp.util.FacesUtil.save(FacesUtil.java:552)
    com.ibm.xsp.component.UIViewRootEx.save(UIViewRootEx.java:1200)
    com.ibm.xsp.component.UIViewRootEx.save(UIViewRootEx.java:1189)
    com.ibm.xsp.application.ActionListenerImpl.processAction(ActionListenerImpl.java:78)
    javax.faces.component.UICommand.broadcast(UICommand.java:324)
    com.ibm.xsp.component.UIEventHandler.broadcast(UIEventHandler.java:366)
    com.ibm.xsp.component.UIViewRootEx.broadcast(UIViewRootEx.java:1669)
    javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:307)
    javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:428)
    com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:94)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:210)
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:96)
    com.ibm.xsp.controller.FacesControllerImpl.execute(FacesControllerImpl.java:256)
    com.ibm.xsp.webapp.FacesServlet.serviceView(FacesServlet.java:231)
    com.ibm.xsp.webapp.FacesServletEx.serviceView(FacesServletEx.java:157)
    com.ibm.xsp.webapp.FacesServlet.service(FacesServlet.java:163)
    com.ibm.xsp.webapp.FacesServletEx.service(FacesServletEx.java:138)
    com.ibm.xsp.webapp.DesignerFacesServlet.service(DesignerFacesServlet.java:103)
    com.ibm.designer.runtime.domino.adapter.ComponentModule.invokeServlet(ComponentModule.java:600)
    com.ibm.domino.xsp.module.nsf.NSFComponentModule.invokeServlet(NSFComponentModule.java:1352)
    com.ibm.designer.runtime.domino.adapter.ComponentModule$AdapterInvoker.invokeServlet(ComponentModule.java:877)
    com.ibm.designer.runtime.domino.adapter.ComponentModule$ServletInvoker.doService(ComponentModule.java:820)
    com.ibm.designer.runtime.domino.adapter.ComponentModule.doService(ComponentModule.java:589)
    com.ibm.domino.xsp.module.nsf.NSFComponentModule.doService(NSFComponentModule.java:1336)
    com.ibm.domino.xsp.module.nsf.NSFService.doServiceInternal(NSFService.java:725)
    com.ibm.domino.xsp.module.nsf.NSFService.doService(NSFService.java:515)
    com.ibm.designer.runtime.domino.adapter.LCDEnvironment.doService(LCDEnvironment.java:357)
    com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:313)
    com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service(XspCmdManager.java:272)
java.lang.NullPointerException
    com.ibm.xsp.model.domino.wrapped.DominoRichTextItem.updateMultipartRelated(DominoRichTextItem.java:1968)
    com.ibm.xsp.model.domino.wrapped.DominoRichTextItem.addMimeToStream(DominoRichTextItem.java:1931)
    com.ibm.xsp.model.domino.wrapped.DominoRichTextItem.updateRTMime(DominoRichTextItem.java:1911)
    com.ibm.xsp.model.domino.wrapped.DominoRichTextItem.updateRichTextItem(DominoRichTextItem.java:1581)
    com.ibm.xsp.model.domino.wrapped.DominoDocument.applyChangesToDoc(DominoDocument.java:2026)
    com.ibm.xsp.model.domino.wrapped.DominoDocument.applyChanges(DominoDocument.java:1995)
    com.ibm.xsp.model.domino.wrapped.DominoDocument.save(DominoDocument.java:1356)
    com.ibm.xsp.model.domino.DominoDocumentData.doSaveDocument(DominoDocumentData.java:684)
    com.ibm.xsp.model.AbstractDocumentDataSource.save(AbstractDocumentDataSource.java:76)
    com.ibm.xsp.model.AbstractDataSource._saveData(AbstractDataSource.java:553)
    com.ibm.xsp.model.AbstractDataSource.save(AbstractDataSource.java:534)
    com.ibm.xsp.util.FacesUtil.save(FacesUtil.java:577)
    com.ibm.xsp.util.FacesUtil.save(FacesUtil.java:552)
    com.ibm.xsp.component.UIViewRootEx.save(UIViewRootEx.java:1200)
    com.ibm.xsp.component.UIViewRootEx.save(UIViewRootEx.java:1189)
    com.ibm.xsp.application.ActionListenerImpl.processAction(ActionListenerImpl.java:78)
    javax.faces.component.UICommand.broadcast(UICommand.java:324)
    com.ibm.xsp.component.UIEventHandler.broadcast(UIEventHandler.java:366)
    com.ibm.xsp.component.UIViewRootEx.broadcast(UIViewRootEx.java:1669)
    javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:307)
    javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:428)
    com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:94)
    com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:210)
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:96)
    com.ibm.xsp.controller.FacesControllerImpl.execute(FacesControllerImpl.java:256)
    com.ibm.xsp.webapp.FacesServlet.serviceView(FacesServlet.java:231)
    com.ibm.xsp.webapp.FacesServletEx.serviceView(FacesServletEx.java:157)
    com.ibm.xsp.webapp.FacesServlet.service(FacesServlet.java:163)
    com.ibm.xsp.webapp.FacesServletEx.service(FacesServletEx.java:138)
    com.ibm.xsp.webapp.DesignerFacesServlet.service(DesignerFacesServlet.java:103)
    com.ibm.designer.runtime.domino.adapter.ComponentModule.invokeServlet(ComponentModule.java:600)
    com.ibm.domino.xsp.module.nsf.NSFComponentModule.invokeServlet(NSFComponentModule.java:1352)
    com.ibm.designer.runtime.domino.adapter.ComponentModule$AdapterInvoker.invokeServlet(ComponentModule.java:877)
    com.ibm.designer.runtime.domino.adapter.ComponentModule$ServletInvoker.doService(ComponentModule.java:820)
    com.ibm.designer.runtime.domino.adapter.ComponentModule.doService(ComponentModule.java:589)
    com.ibm.domino.xsp.module.nsf.NSFComponentModule.doService(NSFComponentModule.java:1336)
    com.ibm.domino.xsp.module.nsf.NSFService.doServiceInternal(NSFService.java:725)
    com.ibm.domino.xsp.module.nsf.NSFService.doService(NSFService.java:515)
    com.ibm.designer.runtime.domino.adapter.LCDEnvironment.doService(LCDEnvironment.java:357)
    com.ibm.designer.runtime.domino.adapter.LCDEnvironment.service(LCDEnvironment.java:313)
    com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.service(XspCmdManager.java:272)

Xsp Properties相关配置

xsp.library.depends=com.ibm.xsp.extlib.library,com.ibm.xsp.extlib.relational.library
#xsp.library.depends=com.ibm.xsp.extlib.library,com.ibm.xsp.extlib.relational.library,org.openntf.domino.xsp.XspLibrary
org.openntf.domino.xsp=godmode,khan,marcel

内容的提问来源于stack exchange,提问作者jcb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:57:02