Wicket:避免 ClassNotFoundException 的部署最佳实践



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

我的部署非常简单:我签出一个SVN工作副本,其中包含包含整个应用程序的预配置标签一次和之后只需要合并/更新并停止/启动网络服务器/应用程序。

重构后,部署应该如何在 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 用户列表中发布了这个问题,但还没有得到太多回应,尽管我认为这是一个简单的问题......

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

当您重构类(如重命名链接类)时,反序列化程序找不到该类,并且您会收到此 ClassNotFoundException。要缓解此问题,您需要:

a. 需要在浏览器中启动新会话,以便 Wicket 不会将您的浏览器与旧类绑定到服务器状态(扔掉 jsessionid cookie),或者

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

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

最新更新