java 重构后泛型反序列化期间抛出 ClassNotFoundException

java ClassNotFoundException thrown during deserialization of Generics following refactoring

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

我创建了一个自定义反序列化器 SessionDeserializer extends ObjectInputStream 它适用于大多数 classes 除了通用 class Result<T>.

泛型 class 本身没有移动,所以我猜测问题出在已移动的 T 对象 class 上。

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

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

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

编辑

在下面添加了结果class:

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;
}
}

Now the issue is that the stacktrace doesn't specify the T class.

那是因为问题不在于 T class。问题是 Result class。相信异常信息。

我无法告诉您为什么 classloader 找不到您的 Result class,但可能的解释是:

  • Result class 不在您的网络应用 classloader 的 class 路径上,或者
  • 这个 class 依赖于缺少的其他 class,或者
  • 此 class 对初始化失败的其他 class 具有初始化依赖性。