2016-05-28 8 views
0

Ich refaktoriert (bewegt) eine Reihe von Klassen und jetzt bekomme ich eine ClassNotFoundException beim Versuch, die Session zu deserialisieren. Klassisch.java ClassNotFoundException während der Deserialisierung von Generics nach Refactoring geworfen

Ich habe eine custome Deserializer SessionDeserializer extends ObjectInputStream erstellt, die für die meisten Klassen mit Ausnahme einer generischen Klasse Result<T> funktioniert.

Die generische Klasse an sich hat sich nicht verschoben, daher vermute ich, dass das Problem in der Objektklasse T liegt, die verschoben wurde.

Jetzt ist das Problem, dass der Stacktrace nicht die T Klasse spezifiziert:

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

Haben Sie einen Weg kennen, um dieses Problem zu umgehen: entweder durch Feststellung, die T Klasse innerhalb des Result<T> Objekts enthalten ist und Anpassung der SessionDeserializer oder durch Überspringen der Deserialisierung des Objekts Result<T> insgesamt?

EDIT

Hinzugefügt wird die Ergebnisklasse unter:

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

Antwort

0

Jetzt ist das Problem, dass der Stacktrace nicht die T-Klasse spezifiziert.

Das ist, weil es nicht die T Klasse ist, die das Problem hier ist. Das Problem ist die Result Klasse. Vertraue der Ausnahmebedingung.

Ich kann Ihnen nicht sagen, warum die Classloader nicht Ihre Result Klasse finden kann, aber mögliche Erklärungen sind:

  • die Result Klasse ist nicht auf Ihrem Classpath des webapps Classloader oder
  • diese Klasse auf einige hängt andere Klasse, die fehlt, oder
  • Diese Klasse hat eine Initialisierungsabhängigkeit von einer anderen Klasse, deren Initialisierung fehlgeschlagen ist.
+0

Die Sache ist die Ergebnisklasse hat sich seit 2014 nicht geändert und verschoben und ich habe erst vor kurzem begonnen, diesen Fehler zu sehen. – user3673749

+0

Ich denke, es ist die Initialisierung des T innerhalb der Ergebnisklasse, die fehlschlägt (Ich habe die Ergebnisklasse zur Frage hinzugefügt) – user3673749

+0

Nein ... Ich meine einige >> Klasse << Initialisierung; d.h. die Initialisierung der statischen Variablen der Klassen und die Ausführung ihrer statischen Blöcke. Wenn diese eine ungeprüfte Ausnahme auslösen, wird eine Klasse als fehlgeschlagen markiert. Wenn dies passiert ist, sollten andere Stacktraces das ursprüngliche Problem melden. –

Verwandte Themen