【问题】
SSH的学习过程中,见到这样的一个错误:
org.apache.catalina.session.StandardManager doLoad
严重: IOException while loading persisted sessions: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: xxxxxxxx
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException:cn.itcast.shop.category.vo.Category
org.apache.catalina.session.StandardManager start
严重: Exception loading sessions from persistent storage
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: xxxxxxx
【调侃】
可是自己一直很纳闷儿的事,同样的代码,同样的操作方式,为什么我老是报这个错?而讲课老师同样的操作就没事了?我也是醉醉的啦~\(≧▽≦)/~(纯属闲扯)
言归正传啊,先解释一下为什么会出现这个问题?
【原因】
在说原因之前,先解释两个词:正常关闭,非正常关闭
正常关闭:就是指在停止tomcat服务时,点击该按钮,myeclipse tomcat——Stop server,等同于点击servers窗口的红色停止按钮,这两种都是属于正常关闭。(如下图:)
非正常关闭:指停止tomcat服务时,点击console窗口的红色按钮:如下图:
当重启服务时,我们需要停止原来的服务,而停止服务有两种方式:1·正常关闭,2·非正常关闭。非正常关闭就会导致session对象销毁,而正常关闭则不会销毁session对象。也就是说,如果我们使用第一种方式关闭,tomcat停止时,还保存着session资源,(目标文件cn.itcast.shop.category.vo.Category类,原来保存于session中,而现在存于硬盘的文件夹里)并完成在session中存着的类的序列化,而由于该目标类没有实现序列化的接口,所以在重启服务时,它会尝试自动恢复session,从而导致序列化和反序列化的异常。
【解决方案】
1·存在session中的类实现序列化接口:如下代码:
package cn.itcast.shop.category.vo;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import cn.itcast.shop.categorysecond.vo.CategorySecond;
@SuppressWarnings("serial")
public class Category implements Serializable {
3·(前提:自己按照tomcat插件)
在server.xml中context下添加如下内容:
再进行启动停止等操作,报如下的类似错误:
org.apache.catalina.session.PersistentManagerBase start
严重: No Store configured, persistence disabled
原因是添加的东东少添加了一点点儿。
解决办法:
修改刚才添加的
将
改为:
差不多就是这些,我选择的是第一种方案,第一种和第二种都可方便的解决该问题。