重构后的泛型反序列化过程中抛出java ClassNotFoundException

时间:2016-05-28 12:02:57

标签: java generics refactoring deserialization

我重构(移动)了一堆类,现在我在尝试反序列化Session时得到ClassNotFoundException。经典。

我创建了一个客户反序列化器SessionDeserializer extends ObjectInputStream,除了通用类Result<T>之外,它适用于大多数类。

泛型类本身并没有移动,所以我猜测问题在于已被移动的T对象类。

现在问题是堆栈跟踪没有指定T类:

java.lang.ClassNotFoundException: com.mysite.shared.beans.Result
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
...

您是否知道解决此问题的方法:通过查找T对象中包含的Result<T>类并调整SessionDeserializer,或者跳过反序列化完全是Result<T>个对象?

修改

添加了以下结果类:

public class Result<T> implements Serializable{
private static final long serialVersionUID=1L;
protected T t=null;
protected boolean success=false;
protected Map<String,String> errors=new HashMap<String,String>();
protected String message=null;

public void setData(T t){
    this.t=t;
}

public T getData(){
    return t;
}

public boolean isSuccess(){
    return success;
}

public Map<String,String> getErrors(){
    return errors;
}

public void setSuccess(boolean success){
    this.success=success;
}

public void setErrors(Map<String,String> errors){
    this.errors=errors;
}

protected void addError(String field, String msg){
    errors.put(field,msg);
}

public String getMessage(){
    return message;
}

public void setMessage(String message){
    this.message=message;
}
}

1 个答案:

答案 0 :(得分:0)

  

现在问题是堆栈跟踪没有指定T类。

那是因为这里不是T类。问题是Result类。信任异常消息。

我无法告诉你为什么类加载器找不到你的Result类,但可能的解释是:

  • Result类不在您的webapps类加载器的类路径中,或
  • 此课程取决于其他一些缺失的课程,或
  • 此类对初始化失败的其他类具有初始化依赖性。