1

我在 Jetty 服务器上部署了我的 Apache Wicket 应用程序,每次打开 Wicket 页面时,我都会在我的码头日志中看到以下错误:

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 但没有成功:(

4

4 回答 4

1

当您在 Jetty 运行时删除数据存储目录时,也会发生这种情况。即使允许 Jetty 创建一个新的,它仍然会抱怨。

对我来说,解决这个问题的方法是重新启动 Jetty。

于 2013-05-28T07:39:31.230 回答
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/

或者,如果您在未在您的 war 文件中打包和部署的代码中启动 Jetty 服务器,您可以在配置和启动 Jetty 的代码中设置属性:

System.setProperty("javax.servlet.context.tempdir", "/path/to/directory/");
于 2013-03-31T00:07:45.030 回答
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>
于 2012-05-09T07:02:21.070 回答
0

这是 Wicket API 方式:org.apache.wicket.settings.IStoreSettings#setFileStoreFolder()

于 2012-05-13T17:51:50.023 回答