我在Jetty服务器上部署了我的Apache Wicket应用程序,每次打开Wicket-Page时,我都可以在我的码头日志中看到以下错误:
WARN - DiskDataStore - Cannot save page with id '2' because the data file cannot be opened.
ERROR - DiskDataStore - /tmp/jetty-0.0.0.0-80-tourney.war-_tourney-any- /wicket.Tourneys-filestore/2gs9iqj4zdjtkerejipyu0co/data (No such file or directory)
java.io.FileNotFoundException: /tmp/jetty-0.0.0.0-80-tourney.war-_tourney-any-/wicket.Tourneys-filestore/2gs9iqj4zdjtkerejipyu0co/data (No such file or directory)
at java.io.RandomAccessFile.open(Native Method)
at java.io.RandomAccessFile.<init>(RandomAccessFile.java:233)
at org.apache.wicket.pageStore.DiskDataStore$SessionEntry.getFileChannel(DiskDataStore.java:410)
at org.apache.wicket.pageStore.DiskDataStore$SessionEntry.savePage(DiskDataStore.java:328)
at org.apache.wicket.pageStore.DiskDataStore.storeData(DiskDataStore.java:176)
at org.apache.wicket.pageStore.AsynchronousDataStore$PageSavingRunnable.run(AsynchronousDataStore.java:348)
at java.lang.Thread.run(Thread.java:636)
知道出了什么问题吗? Unix权限设置正确。我甚至尝试过777但没有成功:(
答案 0 :(得分:1)
当Jetty运行时删除数据存储目录时也会发生这种情况。即使Jetty被允许创建一个新的,它仍然会抱怨。
对我来说,解决这个问题的方法是重启Jetty。
答案 1 :(得分:0)
要更改DiskDataStore目录,您可以使用ServletContextListener:
public class InitListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
final String workDir = sce.getServletContext().getInitParameter("workDirectory"); // Context param with the temp dir path
sce.getServletContext().setAttribute("javax.servlet.context.tempdir", file); // sets the temp dir (Wicket will read it from here)
}
@Override
public void contextDestroyed(ServletContextEvent sce) {}
}
这是必要的web.xml条目:
<context-param>
<param-name>workDirectory</param-name>
<param-value>E:\wicket</param-value>
</context-param>
<listener>
<listener-class>es.cyum.cruekti.wicket.InitListener</listener-class>
</listener>
答案 2 :(得分:0)
以下是Wicket API方式:org.apache.wicket.settings.IStoreSettings #setFileStoreFolder()
答案 3 :(得分:0)
我想我会详细说明Martin的答案,因为对我来说,如何访问IStoreSettings并不是很明显。您可以使用Wicket的API更新数据存储目录,如下所示:
public class MyApplication extends WebApplication {
protected void init() {
super.init();
getStoreSettings().setFileStoreFolder(new File("/path/to/directory/"));
}
}
虽然,我不认为这是一个非常好的主意。由于听起来Wicket默认为javax.servlet.context.tempdir
的值,因此设置该属性比在Java中硬编码值更好远。这样Windows开发人员可以设置自己的值C:\Users\lazydaemon\temp
,Linux开发人员可以设置像/home/lazydaemon/tmp/
这样的值,服务器管理员可以选择类似/var/cache/tomcat-VERSION/Catalina/whatever
的内容,而无需更改代码或脆弱if(configuration==RuntimeConfigurationType.DEVELOPMENT)
-Djavax.servlet.context.tempdir=/path/to/directory/
1}}逻辑。
因此,您可以将该属性设置为服务器启动时的参数:
System.setProperty("javax.servlet.context.tempdir", "/path/to/directory/");
或者,如果您在代码中启动Jetty服务器但未在war文件中打包并部署,则可以在配置和启动Jetty的代码中设置该属性:
{{1}}