1

我是 wicket 的新手,最近才开始将它用于我们的一个项目的新网络应用程序。今天,我遇到了类似WICKET-4785中描述的问题,即页面反序列化期间的 ClassNotFoundException。在我看来,有趣的部分是,缺少提到的类是有充分理由的:我只是稍微重构了一下并重命名了类,重新部署并重新启动了我的 Tomcat。这对我来说看起来像是一个正常的用例,但是当我通读文档时我没有想到这是因为。

我的部署非常简单:我检查了一个包含整个应用程序的预配置标签的 SVN 工作副本,然后只需要合并/更新和停止/启动 Web 服务器/应用程序。

在我重构或以其他方式更改有关缓存和序列化页面的类之后,部署应该如何在 Wicket 中工作?有什么我需要告诉检票口在每次部署时清除其缓存或忽略这些或其他什么?我是否被迫在相当长的一段时间内不删除已部署的类?那将是一场小小的噩梦……或者我遇到的任何其他问题我应该避免吗?

显然,其他人也确实部署了他们的 Wicket 应用程序,所以我希望您对如何避免我遇到的问题有一些意见。谢谢!

堆栈跟踪的重要部分:

java.lang.ClassNotFoundException: de.am_soft.util.frontend.wicket.markup.link.LogoutLink
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
     at java.lang.Class.forName0(Native Method)
     at java.lang.Class.forName(Unknown Source)
     at org.apache.wicket.application.AbstractClassResolver.resolveClass(AbstractClassResolver.java:108)
     at org.apache.wicket.serialize.java.JavaSerializer$ClassResolverObjectInputStream.resolveClass(JavaSerializer.java:218)
     at java.io.ObjectInputStream.[...]
     at org.apache.wicket.serialize.java.JavaSerializer.deserialize(JavaSerializer.java:122)
     at org.apache.wicket.pageStore.DefaultPageStore.deserializePage(DefaultPageStore.java:396)
     at org.apache.wicket.pageStore.DefaultPageStore.getPage(DefaultPageStore.java:135)
     at org.apache.wicket.page.PageStoreManager$SessionEntry.getPage(PageStoreManager.java:203)
     at org.apache.wicket.page.PageStoreManager$PersistentRequestAdapter.getPage(PageStoreManager.java:360)
     at org.apache.wicket.page.AbstractPageManager.getPage(AbstractPageManager.java:107)

我也在Wicket 用户列表上发布了这个问题,但还没有得到太多回应,虽然我认为这是一个简单的问题......

4

1 回答 1

2

Wicket 是一个有状态的 Web 框架,它存储页面实例以促进浏览器和服务器之间的紧密用户交互。这意味着序列化每个页面的组件层次结构,以便用户可以与组件层次结构交互、修改它(例如替换面板)并期望客户端和服务器同步。

当您重构您的类(例如重命名链接类)时,反序列化程序找不到该类,您会得到这个 ClassNotFoundException。为了减轻这种情况,您:

一个。需要在您的浏览器中启动一个新会话,以便 Wicket 不会将您的浏览器与旧类的服务器状态联系起来(扔掉 jsessionid cookie),或者

湾。在会话中构造一个新页面实例(删除浏览器 URL 中的 ?0 或 ?1231 参数),或

C。清除服务器上的所有会话数据

于 2014-11-24T10:50:32.550 回答