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

时间:2014-11-22 20:07:47

标签: deployment wicket web-deployment classnotfoundexception wicket-6

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

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

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

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

stacktrace的重要部分:

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 users list上发布了这个问题,但是还没有得到很多答复,尽管我认为这是一个简单的问题......

1 个答案:

答案 0 :(得分:2)

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

当您重构类(例如重命名链接类)时,反序列化器无法找到该类,并且您获得此ClassNotFoundException。为了缓解这一点:

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

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

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