2016-07-27 26 views
1

Ich bin ein JavaEE Anwendung schreiben, und ich habe folgendes Problem: Wenn ich eine neue Variable in einer der Klassen (TraceMessage) initialisieren und die Anwendung starten, erhalte ich die folgende Fehlermeldung:JavaEE - InvalidClassException

java.io.InvalidClassException: com.nsn.extmon.util.TraceMessage; local class incompatible: stream classdesc serialVersionUID = -5424907704652912574, local class serialVersionUID = -5748024201087063218 
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:612) 
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1630) 
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1521) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1779) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) 
at java.util.ArrayList.readObject(ArrayList.java:771) 
at sun.reflect.GeneratedMethodAccessor355.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1058) 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1907) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1806) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1353) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:373) 
at com.nsn.extmon.databaseHandling.ResultDataHandler.getTraceMessages(ResultDataHandler.java:137) 
at com.nsn.extmon.util.TraceResultBean.traceRead(TraceResultBean.java:50) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at org.apache.el.parser.AstValue.invoke(AstValue.java:278) 
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274) 
at org.apache.myfaces.view.facelets.el.ContextAwareTagMethodExpression.invoke(ContextAwareTagMethodExpression.java:96) 
at org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:72) 
at javax.faces.component.UICommand.broadcast(UICommand.java:120) 
at org.richfaces.component.RowKeyContextEventWrapper.broadcast(RowKeyContextEventWrapper.java:104) 
at org.richfaces.component.UIDataAdaptor.broadcast(UIDataAdaptor.java:452) 
at javax.faces.component.UIViewRoot._broadcastAll(UIViewRoot.java:1013) 
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:284) 
at javax.faces.component.UIViewRoot._process(UIViewRoot.java:1302) 
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:745) 
at org.apache.myfaces.lifecycle.InvokeApplicationExecutor.execute(InvokeApplicationExecutor.java:38) 
at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:170) 
at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at com.nsn.extmon.authentication.LoginFilter.doFilter(LoginFilter.java:33) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:611) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1721) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1679) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 

Ich habe keine Ahnung, was dieser Fehler ist, ich weiß nur, wenn ich Variablennamen ändern, dann funktioniert alles gut. Der Fehler tritt nur auf, wenn ich neue Variablen deklariere.

Danke in Beratung.

+0

einen Blick auf einige Codebeispiel dieses –

Antwort

4

Eine InvalidClassException Klasse Ausnahme tritt in dieser Situation, wenn Sie deserialise (Empfang, Laden, etc.) ein Objekt in einen Java-Prozess, der eine verschiedene Version der Klasse, die als ein während der Serialisierung (Senden, Speicher verwendet hat, usw.).

Es sieht so aus, als ob Sie Objekte in der Datenbank speichern (com.nsn.extmon.databaseHandling.ResultDataHandler?). Ich denke, es gibt serialisierte Blobs in der Datenbank, die mit einer anderen Version der Klasse serialisiert sind ("Felder hinzufügen"), wenn Sie sie erneut aus der Datenbank lesen.

Wenn Sie Felder hinzufügen, sollten Sie die serialVersionUID die gleichen (für nicht Vertrag brech Änderungen) halten

Für Beispiel

public class TraceMessage implements Serializable { 

    private static final long serialVersionUID = 1L; 
    … 
} 

Wenn es ein Vertrag brechend ist ändern, dann müssen Sie sicherstellen, dass Sie die gleiche Klassenversion an beiden Enden haben.

Wenn Sie Nachrichten zwischen Anwendungen senden, dann möchten Sie vielleicht auch in einem weniger spröden Protokoll wie Google Protobuf suchen.

EDIT (siehe Kommentare): Wenn Sie die alten Klassen gespeichert in Ihrer Datenbank mit der neuen Klasse laden möchten, stellen Sie dann Ihre serialVersionUID zu -5424907704652912574

+0

verstehen helfen würde, ist es einfach Senden und Lesen von Daten aus der Datenbank, ich habe versucht, 'private statische final long serialVersionUID = 1L;' aber dann bekomme ich den folgenden Fehler: 'java.io.InvalidClassException: com.nsn.extmon.util.TraceMessage; lokale Klasse inkompatibel: stream classdesc serialVersionUID = -5424907704652912574, lokale Klasse serialVersionUID = 1'. Ich verstehe, dass die bereits serialisierte Objekt-ID gleich bleibt. –

+0

Sie müssen einige Migrationsarbeiten durchführen: Wahrscheinlich haben Sie noch Objekte in der Datenbank, die mit einer älteren Version Ihrer Klasse geschrieben wurden. Sie müssen sie entweder mit den alten Klassendateien laden oder Ihre 'serialVersionUID' auf' -5424907704652912574' setzen. –

+0

Ich habe die ID in -5424907704652912574 geändert und es funktioniert jetzt. Vielen Dank. :) –