2016-03-26 15 views
0

Kısıtlayıcıyım ile ilgili bir sorun yaşıyorum. Ben aşağıdaki gibi görünen bir dosya var:jaxb unMarshaller hatası ClassCastException çünkü iki xml öğesi aynı ada sahip. Niye ya?

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

sorun kök öğesi ve elemanların listesi aynı ismi "Çalışan" dir. Unmarshal'a gittiğimde bir classcastexception alırım.

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

ben tam olarak ben unmarshal gerek dosyası gibi görünen bir dosyayı sıralamakta bu kodu kullanmak mümkün. Bu yüzden kafam karıştı.

çoğaltmak edilemiyor
java.lang.ClassCastException: XXXX.EmployeeInformationElement cannot be cast to XXXX.EmployeeInformation 

cevap

0

(Java 1.8.0_65 üzerinde test): Ben unmarshal zaman bu kadar eksik ne unmarshaller bana şu istisna vermez.

MCVE (Minimal, Complete ve Verifiable örneği) sağlamadığınızdan, işte budur.

Sadece bilinen fark, basit test için ad alanının kaldırılmış olmasıdır.

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

Cevabınız için teşekkür ederiz. Çalışan Element sınıfını yayınlamayı unutmuşum gibi görünüyor. Kodu, sahip olduğum konuya indirgemeye çalışıyordum ve birlikte çalıştığım tüm sistemde insanların kaybolmamasını sağlamaya çalışıyordum. Bu benim çalışanımın ihtiyaç duymadığım bir kök öğesi eklediğimi fark etmeme yardımcı oldu. Yardım için teşekkürler. Problem çözüldü ve devam ediyor. Teşekkürler! – Koder29