2016-03-26 8 views
0

私はアンマーシャラーに問題があります。私は次のようなファイルを持っています:jaxb unMarshallerの失敗ClassCastException 2つのxml要素が同じ名前であるためです。どうして?

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

問題はルート要素であり、要素のリストは "Employee"と同じ名前です。非マーシャルに行くと、クラスキャスト例外が発生します。

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

このコードを使用して、非整列化する必要があるファイルとまったく同じファイルをマーシャリングすることができます。だから私は混乱している。

再現することができません
java.lang.ClassCastException: XXXX.EmployeeInformationElement cannot be cast to XXXX.EmployeeInformation 

答えて

0

(Javaの1.8.0_65でテスト):私は非整列化時にとても不足しているもの、アンマーシャラーは私に次の例外を与えるものではありません。

MCVE(最小、完全、および検証可能な例)を提供していないため、ここで動作します。

既知の違いは、単純なテストでは名前空間が削除されたことだけです。

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

返信いただきありがとうございます。私はEmployee Elementクラスを投稿するのを忘れてしまったようです。私はコードを、私が持っていた問題に単純化し、私が働いている完全なシステムで人を失わないようにしようとしていました。これにより、私が必要としなかったEmployeeInformationElementにルート要素を追加したことがわかりました。お手伝いありがとう。問題が解決し、移動しています。ありがとう! – Koder29

関連する問題