2012-02-29 8 views
6

Sto usando xstream sotto bollitore di deserializzare XML a un oggetto Java e mi dà sempre l'eccezione: nodecom.thoughtworks.xstream.mapper.CannotResolveClassExceptionnodecom.thoughtworks.xstream.mapper.CannotResolveClassException durante l'utilizzo xstream sotto bollitore

Poi ho provato il mio codice separatamente da Kettle e come una semplice applicazione Java. e funziona bene. Per esempio:

public static void main(String[] args) { 
    person p = new person("JJ", "MM"); 
    XStream xstream = new XStream(new DomDriver()); 
    xstream.alias("personname", person.class); 
    String xml = xstream.toXML(p); 
    person pp = (person) xstream.fromXML(xml); 
    System.out.println(pp.toString()); 
} 


public class person { 

    private String firstname; 
    private String lastname; 

    public person(String first, String last) { 
     this.firstname = first; 
     this.lastname = last; 
    } 

    public String getFirstname() { 
     return this.firstname; 
    } 

    public String getLastname() { 
     return this.lastname; 
    } 

    public void setFirstname(String name) { 
     this.firstname = name; 
    } 

    public void setLastname(String name) { 
     this.lastname = name; 
    } 

} 

E questo codice funziona bene. Tuttavia, quando sposto questo codice nel plugin Kettle fallisce nel passaggio per leggere i metadati dal file XML.

risposta

9

Sono stato in grado di risolvere il problema. Ho dovuto impostare il caricatore di classe per l'istanza XStream che sto utilizzando per deserializzare la stringa xml.

Quindi, prima di chiamare xstream.fromXml(xml) fare questo:

xstream.setClassLoader(person.class.getClassLoader()); 

Questo risolverà l'eccezione xstream.mapper.CannotResolveClassException. Questo è veramente strano Spero che questo ti aiuti.

+3

alcuna idea * perché * questo è necessario? – Baczek

3
*xstream.alias("personname", person.class);* 

cambiamento per includere il nome della classe, funzionerà

xstream.alias("person", person.class); 
Problemi correlati