Java 如何在XPages系统事件中从文件系统中删除文件

Java 如何在XPages系统事件中从文件系统中删除文件,java,xpages,Java,Xpages,当会话终止时,我想删除一个文件,但是,当试图从文件系统修改文件时,我得到一个Notes安全异常 以下是我尝试过的: File f = getSourceFile(); f.delete(); // java.lang.SecurityException: Zugriff auf die Datei {0} bzw. diese zu ändern ist nicht zulässig (Accessing or modifiying this File is prohibited) F

当会话终止时,我想删除一个文件,但是,当试图从文件系统修改文件时,我得到一个Notes安全异常

以下是我尝试过的:

File f = getSourceFile();    
f.delete(); // java.lang.SecurityException: Zugriff auf die Datei {0} bzw. diese zu ändern ist nicht zulässig (Accessing or modifiying this File is prohibited)

FileUtils.clearFile(f); // java.lang.IllegalStateException: NotesContext is not initialized for the Thread 
以下是我检索文件的方式:

public File getSourceFile() {
    return new File(this.absolutePath);
}
我还尝试使用doPrivileged,但这导致了同样的非法状态异常:

AccessController.doPrivileged(new PrivilegedAction() { // java.lang.IllegalStateException: NotesContext is not initialized for the Thread
    public Object run() {   
        File f = getSourceFile();
            if(f.exists()){
                FileUtil.deleteFile(f);
            }
    }
});
我想以某种方式重新初始化NotesContext是可能的,但我认为这不是一个优雅的解决方案

堆栈跟踪:

(非法国家)

(保安)

我无法找到解决方法。

您有两种选择:

  • 编辑java.policy(或创建java.pol-不在11.0上)
  • 将代码移动到osgi插件中
对于后者:这并不像听起来那么可怕。您的插件将位于updatesite.nsf中


检查入门信息。

我做了一个快速测试,一切正常。ND9和ND10

会话侦听器,在“会话已销毁”事件中删除文件,不修改java.policy

编辑:
啊,明白了。这与文件删除无关。从“会话已销毁”事件访问NSF中的类时,这是一个类加载器问题。

您是否更新了domino服务器上的java.policy或java.pol文件?签名者有足够的权限吗?签名者有足够的权限,修改pol文件是可行的,但我希望我能以不同的方式解决它。我只是不喜欢我的应用程序依赖这样的设置(无法通过Designer/Notes UI访问),但是非常感谢您提供了一个有效的解决方案……您有关于xPages osgi库的其他/更多信息吗?或者是一些样板代码?我尝试从幻灯片中重建Hello World库,但不幸的是,在安装本地更新站点后,控件没有显示在控件托盘中,并且库ID没有列在XSP道具中。我找不到幻灯片放映的任何回购协议。大多数在线教程只是解释如何设置Eclipse环境…请转到OpenNTF.org。在GitHub上的REPO中有许多OSGi插件,它们都有完整的源代码。这里有一个小插件,如boiler plate:
java.lang.IllegalStateException: NotesContext not initialized for the thread
at com.ibm.domino.xsp.module.nsf.NotesContext.getCurrent(NotesContext.java:123)
at com.ibm.domino.xsp.module.nsf.ModuleClassLoader$DynamicClassLoader.findClass(ModuleClassLoader.java:438)
at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:924)
at java.lang.ClassLoader.loadClass(ClassLoader.java:869)
at com.ibm.domino.xsp.module.nsf.ModuleClassLoader$DynamicClassLoader.loadClass(ModuleClassLoader.java:403)
at java.lang.ClassLoader.loadClass(ClassLoader.java:852)
at de.iV.beans.ticket.file.FileWrapper.clear(FileWrapper.java:90)
at de.iV.beans.ticket.Ticket.clearFiles(Ticket.java:155)
at de.iV.session.CustomSessionListener.sessionDestroyed(CustomSessionListener.java:46)
at com.ibm.xsp.application.ApplicationSessionListener.sessionDestroyed(ApplicationSessionListener.java:53)
at com.ibm.designer.runtime.domino.adapter.ComponentModule.notifySessionRemoved(ComponentModule.java:370)
at com.ibm.designer.runtime.domino.adapter.ComponentModule.checkSessionTimeout(ComponentModule.java:239)
at com.ibm.domino.xsp.module.nsf.NSFComponentModule.checkTimeout(NSFComponentModule.java:213)
at com.ibm.domino.xsp.module.nsf.NSFService.checkTimeout(NSFService.java:281)
at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.checkTimeout(LCDEnvironment.java:247)
at com.ibm.designer.runtime.domino.bootstrap.BootstrapEnvironment.tellCommand(BootstrapEnvironment.java:388)
at com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.tell(XspCmdManager.java:92
    java.lang.SecurityException: Zugriff auf die Datei {0} bzw. diese zu ändern ist nicht zulässig
at lotus.notes.AgentSecurityManager.checkDelete(Unknown Source)
at java.io.File.delete(File.java:1047)
at de.iV.beans.ticket.file.FileWrapper.clear(FileWrapper.java:94)
at de.iV.beans.ticket.Ticket.clearFiles(Ticket.java:155)
at de.iV.session.CustomSessionListener.sessionDestroyed(CustomSessionListener.java:46)
at com.ibm.xsp.application.ApplicationSessionListener.sessionDestroyed(ApplicationSessionListener.java:53)
at com.ibm.designer.runtime.domino.adapter.ComponentModule.notifySessionRemoved(ComponentModule.java:370)
at com.ibm.designer.runtime.domino.adapter.ComponentModule.checkSessionTimeout(ComponentModule.java:239)
at com.ibm.domino.xsp.module.nsf.NSFComponentModule.checkTimeout(NSFComponentModule.java:213)
at com.ibm.domino.xsp.module.nsf.NSFService.checkTimeout(NSFService.java:281)
at com.ibm.designer.runtime.domino.adapter.LCDEnvironment.checkTimeout(LCDEnvironment.java:247)
at com.ibm.designer.runtime.domino.bootstrap.BootstrapEnvironment.tellCommand(BootstrapEnvironment.java:388)
at com.ibm.domino.xsp.bridge.http.engine.XspCmdManager.tell(XspCmdManager.java:92)