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 具有初始化依赖性。
我重构(移动)了一堆 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 具有初始化依赖性。