Jetty上的Wicket:无法保存带有id的页面

时间:2012-05-01 21:05:34

标签: java jetty wicket wicket-1.5

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

4 个答案:

答案 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}}