XStream ConversionException beim Deserialisieren in (Hibernate)Objekt

nyhet

Mitglied
Hallo,

beim Deserialisieren über XStream aus einer XML bekomme ich eine ConversionException und weiß nicht, wie ich nun weitermache mit der Fehlersuche. Es geht um eine OSGi-Anwendung, die entsprechenden jars bzw Bundles sind meiner Meinung nach alle vorhanden.

Code:
Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: db.hibernateobjects.Topziel_$$_javassist_10 : db.hibernateobjects.Topziel_$$_javassist_10 : db.hibernateobjects.Topziel_$$_javassist_10 : db.hibernateobjects.Topziel_$$_javassist_10
---- Debugging information ----
message             : db.hibernateobjects.Topziel_$$_javassist_10 : db.hibernateobjects.Topziel_$$_javassist_10
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : db.hibernateobjects.Topziel_$$_javassist_10 : db.hibernateobjects.Topziel_$$_javassist_10
class               : db.hibernateobjects.Drehbuch
required-type       : db.hibernateobjects.Validierungsziel
path                : /db.hibernateobjects.Drehbuch/randbedingungen/versuchsfall/versuchsfallValidierungsziels/storedSnapshot/entry[4]/db.hibernateobjects.VersuchsfallValidierungsziel/validierungsziel/topziel
line number         : 421
-------------------------------
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:246)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:218)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
    at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:71)
    at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:75)
    at com.thoughtworks.xstream.converters.collections.MapConverter.unmarshal(MapConverter.java:66)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:246)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:218)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:246)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:218)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:246)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:218)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:246)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:218)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
    at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
    at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
    at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
    at com.thoughtworks.xstream.XStream.fromXML(XStream.java:861)
    at rog.MyClass.myMethod(MyClass.java:17)
    at rog.MyClass.main(MyClass.java:31)
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: db.hibernateobjects.Topziel_$$_javassist_10 : db.hibernateobjects.Topziel_$$_javassist_10
    at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:68)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:71)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:86)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:96)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
    at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:52)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.determineType(AbstractReflectionConverter.java:333)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:208)
    at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
    at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
    ... 47 more

Das Serialisieren klappt wunderbar, auch aus den Hibernate-Objekten. Nur beim Deserialisieren hauts nicht hin...

Die XML-Stelle, an der es abbricht, ist hier (bei "Zeile 7"):

[XML]<entry>
<db.hibernateobjects.VersuchsfallValidierungsziel>
<id>344</id>
<versuchsfall reference="../../../../.."/>
<validierungsziel>
<id>22</id>
<topziel class="db.hibernateobjects.Topziel_$$_javassist_10" reference="../../../../entry/db.hibernateobjects.VersuchsfallValidierungsziel/validierungsziel/topziel"/>
<sortierung>2</sortierung>
<bezeichnung>Änderung des Beschleunigungsverhaltens</bezeichnung>
<messgroessenValidierungsziels class="org.hibernate.collection.PersistentSet">
<initialized>false</initialized>
<owner class="db.hibernateobjects.Validierungsziel" reference="../.."/>
<cachedSize>-1</cachedSize>
<role>db.hibernateobjects.Validierungsziel.messgroessenValidierungsziels</role>
<key class="int">22</key>
<dirty>false</dirty>
</messgroessenValidierungsziels>
<versuchsfallValidierungsziels class="org.hibernate.collection.PersistentSet">
<initialized>false</initialized>
<owner class="db.hibernateobjects.Validierungsziel" reference="../.."/>
<cachedSize>-1</cachedSize>
<role>db.hibernateobjects.Validierungsziel.versuchsfallValidierungsziels</role>
<key class="int">22</key>
<dirty>false</dirty>
</versuchsfallValidierungsziels>
</validierungsziel>
<zuordnung>x</zuordnung>
</db.hibernateobjects.VersuchsfallValidierungsziel>
<db.hibernateobjects.VersuchsfallValidierungsziel reference="../db.hibernateobjects.VersuchsfallValidierungsziel"/>
</entry>[/XML]

Mein Code an der Stelle besteht eigentlich nur aus zwei Zeilen, mehr braucht man bei XStream ja *eigentlich* nicht:

Java:
xStream = new XStream();
            context.getControlServiceImpl().setDrehbuch((Drehbuch)xStream.fromXML(xmlDrehbuch));

Hat jemand einen Tipp oder kennt dieses Problem?

Wenn ich noch mehr Informationen posten soll, bitte Bescheid geben... ist mein erster Eintrag hier 😉
 
worum gehts denn grundsätzlich, lädst du in irgendeinem Programm X aus Hibernate Daten und schickst sie auf irgendeine Weise an Programm Y?

dann rate ich dir grundsätzlich, keine Hibernate-Objekte zu verschicken, auch sowas wie org.hibernate.collection.PersistentSet will doch der Empfänger sicher nicht haben,
dagegen hilft nur der aufwendige Weg, alle Klassen zu kopieren, jedes Objekt einzeln umzuwandeln,
vielleicht nicht direkt attraktiv, muss auch nicht sein wenn ansonsten alles geht 😉

Pattern:
Data transfer object - Wikipedia, the free encyclopedia
Core J2EE Patterns - Transfer Object

------

ansonsten Vermutung:
dein Fehler ist möglicherweise, dass Hibernate bestimmte Daten noch nicht aus der DB geladen hat, sondern nur einen Proxy etwa mit der DB-Id setzt und die Daten erst nachlädt, wenn sie benötigt werden,
würde hier die Session geschlossen und auf das Objekt zugegriffen werden, gibts eine LazyInitialisationException, falls dir das was sagt,

dagegen hilft, LazyLoading im Mapping zu verringern, auf die Objekte vor dem Speichern zuzugreifen (um das Nachladen auszulösen)
oder Methoden a la Hibernate.initialize(object); zu verwenden
 
Zuletzt bearbeitet von einem Moderator:
worum gehts denn grundsätzlich, lädst du in irgendeinem Programm X aus Hibernate Daten und schickst sie auf irgendeine Weise an Programm Y?

Ja, ich lade in meinem Webservice aus Hibernate Daten und schicke die dann (als zip) an den Client, wo sie entzippt und zurück zum Objekt gebracht werden sollen.

dann rate ich dir grundsätzlich, keine Hibernate-Objekte zu verschicken, auch sowas wie org.hibernate.collection.PersistentSet will doch der Empfänger sicher nicht haben,
dagegen hilft nur der aufwendige Weg, alle Klassen zu kopieren, jedes Objekt einzeln umzuwandeln,
vielleicht nicht direkt attraktiv, muss auch nicht sein wenn ansonsten alles geht 😉

Pattern:
Data transfer object - Wikipedia, the free encyclopedia
Core J2EE Patterns - Transfer Object

Das ist leider nicht so einfach, da sich die Objekte öfter ändern und das Bundle auch ziemlich riesig ist...

ansonsten Vermutung:
dein Fehler ist möglicherweise, dass Hibernate bestimmte Daten noch nicht aus der DB geladen hat, sondern nur einen Proxy etwa mit der DB-Id setzt und die Daten erst nachlädt, wenn sie benötigt werden,
würde hier die Session geschlossen und auf das Objekt zugegriffen werden, gibts eine LazyInitialisationException, falls dir das was sagt,

dagegen hilft, LazyLoading im Mapping zu verringern, auf die Objekte vor dem Speichern zuzugreifen (um das Nachladen auszulösen)
oder Methoden a la Hibernate.initialize(object); zu verwenden

Danke, das könnte wirklich ein Grund sein. Kann man irgendwo in der hibernate-config einstellen, dass LazyLoading verringert/verhindert wird? Die genannte Exception ist bei mir noch nicht aufgetreten.
 
was hast du für Mappings, Annotations oder extra XML-Dateien?
siehe z.B.
Hibernate Annotations

2.2.5.5. Association fetching

You have the ability to either eagerly or lazily fetch associated entities. The fetch parameter can be set to FetchType.LAZY or FetchType.EAGER. EAGER will try to use an outer join select to retrieve the associated object, while LAZY will only trigger a select when the associated object is accessed for the first time. @OneToMany and @ManyToMany associations are defaulted to LAZY and @OneToOne and @ManyToOne are defaulted to EAGER. For more information about static fetching, check Section 2.4.5.1, “Lazy options and fetching modes”.
 
Ich habe jetzt sämtliche FetchType.LAZY durch FetchType.EAGER ersetzt und bekomme nun eine andere Fehlermeldung:

Code:
Exception in thread "main" com.thoughtworks.xstream.converters.ConversionException: Could not call org.hibernate.proxy.pojo.javassist.SerializableProxy.readResolve() : could not create proxy for entity: db.hibernateobjects.Verkehrszustand : Could not call org.hibernate.proxy.pojo.javassist.SerializableProxy.readResolve() : could not create proxy for entity: db.hibernateobjects.Verkehrszustand
---- Debugging information ----
message             : Could not call org.hibernate.proxy.pojo.javassist.SerializableProxy.readResolve() : could not create proxy for entity: db.hibernateobjects.Verkehrszustand
cause-exception     : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message       : Could not call org.hibernate.proxy.pojo.javassist.SerializableProxy.readResolve() : could not create proxy for entity: db.hibernateobjects.Verkehrszustand
class               : db.hibernateobjects.Drehbuch
required-type       : org.hibernate.proxy.pojo.javassist.SerializableProxy
path                : /db.hibernateobjects.Drehbuch/randbedingungen/verkehrszustand
line number         : 19
-------------------------------
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)

etc.
 
ich persönlich kann dazu nicht weiterhelfen

edit: oder ganz grob aus Internet-Quelltexten herauslesen, dass vielleicht public setter/ getter für die Objekt, deren Ids usw. fehlen, auch leere Konstruktoren vorhanden?

Java:
private Object readResolve() {
   77   		try {
   78   			return CGLIBLazyInitializer.getProxy(
   79   				entityName,
   80   				persistentClass,
   81   				interfaces,
   82   				getIdentifierMethodName==null ?
   83   					null :
   84   					getIdentifierMethodClass.getDeclaredMethod(getIdentifierMethodName, null),
   85   				setIdentifierMethodName==null ?
   86   					null :
   87   					setIdentifierMethodClass.getDeclaredMethod(setIdentifierMethodName, setIdentifierMethodParams),
   88   					componentIdType,
   89   				id,
   90   				null
   91   			);
   92   		}
   93   		catch (NoSuchMethodException nsme) {
   94   			throw new HibernateException("could not create proxy for entity: " + entityName, nsme);
   95   		}
   96   	}

poste doch mal die beiden beteiligten Objekt-Klassen + Mappings
 
Zuletzt bearbeitet von einem Moderator:
Public getter/setter etc ist alles drin, zB das Objekt "Verkehrszustand", bei dem die Exception auftritt...

Java:
@Entity
@Table(name = "verkehrszustand", schema = "public")
public class Verkehrszustand implements java.io.Serializable {

    private int id;
    private String bezeichnung;
    private String abkuerzung;
    private Set<Randbedingungen> randbedingungens = new HashSet<Randbedingungen>(
            0);

    public Verkehrszustand() {
    }

    public Verkehrszustand(int id) {
        this.id = id;
    }

    public Verkehrszustand(int id, String bezeichnung, String abkuerzung,
            Set<Randbedingungen> randbedingungens) {
        this.id = id;
        this.bezeichnung = bezeichnung;
        this.abkuerzung = abkuerzung;
        this.randbedingungens = randbedingungens;
    }

    @Id
    @Column(name = "id", unique = true, nullable = false)
    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "bezeichnung")
    public String getBezeichnung() {
        return this.bezeichnung;
    }

    public void setBezeichnung(String bezeichnung) {
        this.bezeichnung = bezeichnung;
    }

    @Column(name = "abkuerzung")
    public String getAbkuerzung() {
        return this.abkuerzung;
    }

    public void setAbkuerzung(String abkuerzung) {
        this.abkuerzung = abkuerzung;
    }

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "verkehrszustand")
    public Set<Randbedingungen> getRandbedingungens() {
        return this.randbedingungens;
    }

    public void setRandbedingungens(Set<Randbedingungen> randbedingungens) {
        this.randbedingungens = randbedingungens;
    }

}

Und vielen Dank für die bisherige Hilfe 🙂
 

Zurück
Oben