2016-03-26 7 views
0

Ich habe ein Problem mit meinem Unmarshaller. Ich habe eine Datei, die wie folgt aussieht:jaxb unMarshaller Fehler ClassCastException, weil zwei XML-Elemente den gleichen Namen haben. Warum?

<Employee xmlns="namespace here"> 
<Employee> 
    <Id>2</Id> 
    <Name>idk</Name> 
</Employee> 
</Employee> 

Das Problem ist das Wurzelelement und die Liste der Elemente die gleichen Namen „Mitarbeiter“ sind. Wenn ich zum Unmarshal gehe, bekomme ich eine Klassenkasstexzeption.

@XmlRootElement(name="Employee") 
public class EmployeeInformation { 

List<EmployeeInformationElement> elements; 
private String errorCode; 
private String errorMessage; 

public List<EmployeeInformationElement> getElements() { 
    return elements; 
} 
@XmlElement(name="Employee") 
public void setElements(List<EmployeeInformationElement> elements) { 
    this.elements = elements; 
} 
public String getErrorCode() { 
    return errorCode; 
} 
@XmlElement(name="ErrorCode") 
public void setErrorCode(String errorCode) { 
    this.errorCode = errorCode; 
} 
public String getErrorMessage() { 
    return errorMessage; 
} 
@XmlElement(name="ErrorMessage") 
public void setErrorMessage(String errorMessage) { 
    this.errorMessage = errorMessage; 
} 

Ich kann diesen Code verwenden, um eine Datei zu ordnen, die genau wie die Datei aussieht ich entpacken müssen. Also bin ich verwirrt. Was so fehlt, wenn ich entpacken, wird die Unmarshaller nicht geben Sie mir die folgende Ausnahme:

java.lang.ClassCastException: XXXX.EmployeeInformationElement cannot be cast to XXXX.EmployeeInformation 

Antwort

0

konnte nicht reproduzieren (getestet auf Java 1.8.0_65).

Da Sie kein MCVE (Minimal, Complete und Verifable Beispiel) zur Verfügung gestellt haben, hier ist eine, die funktioniert.

Der einzige bekannte Unterschied besteht darin, dass der Namespace für einfache Tests entfernt wurde.

import java.io.StringReader; 
import java.util.List; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

public class Test { 
    public static void main(String[] args) throws Exception { 
     String xml = "<Employee>\r\n" + 
        "<Employee>\r\n" + 
        " <Id>2</Id>\r\n" + 
        " <Name>idk</Name>\r\n" + 
        "</Employee>\r\n" + 
        "</Employee>\r\n"; 
     JAXBContext jaxbContext = JAXBContext.newInstance(EmployeeInformation.class); 
     Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
     EmployeeInformation empInfo = (EmployeeInformation)unmarshaller.unmarshal(new StringReader(xml)); 
     System.out.println(empInfo); 
    } 
} 
@XmlRootElement(name="Employee") 
class EmployeeInformation { 

    private List<EmployeeInformationElement> elements; 

    @XmlElement(name="Employee") 
    public List<EmployeeInformationElement> getElements() { 
     return elements; 
    } 
    public void setElements(List<EmployeeInformationElement> elements) { 
     this.elements = elements; 
    } 
} 
class EmployeeInformationElement { 

    private int id; 
    private String name; 

    @XmlElement(name="Id") 
    public int getId() { 
     return this.id; 
    } 
    public void setId(int id) { 
     this.id = id; 
    } 

    @XmlElement(name="Name") 
    public String getName() { 
     return this.name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 
+0

Danke für die Antwort. Es sieht so aus, als hätte ich vergessen die Employee Element Klasse zu posten. Ich habe versucht, den Code auf das Problem, das ich hatte, zu vereinfachen und nicht Leute in dem ganzen System zu verlieren, mit dem ich arbeite. Dies half mir zu erkennen, dass ich auf meinem EmployeeInformationElement ein Root-Element hinzugefügt hatte, das ich nicht benötigte. Danke für die Hilfe. Problem gelöst und weiter gemacht. Vielen Dank! – Koder29

Verwandte Themen