2013-06-27 1 views
2

Мой главный классjava.lang.ClassCastException: com.kk.COUNTRY не может быть приведен к javax.xml.bind.JAXBElement

public static void main(String[] args) throws JAXBException, 
     FileNotFoundException { 

    Class[] classes = new Class[5]; 
    classes[0] = com.kk.AddressDetails.class; 
    classes[1] = com.kk.COUNTRY.class; 
    classes[2] = com.kk.ObjectFactory.class; 
    classes[3] = com.kk.Details.class; 
    classes[4] = com.kk.Districts.class; 

    JAXBContext context = JAXBContext.newInstance(classes); 

    Unmarshaller unmarshaller = context.createUnmarshaller(); 

    JAXBElement<COUNTRY> unmarshal = (JAXBElement<COUNTRY>) unmarshaller 
      .unmarshal(new File("src\\countrydetails.xml")); 
    COUNTRY value = unmarshal.getValue(); 
      System.out.println(value); 

Так при составлении этого я получил это исключение в потоке «Основной "java.lang.ClassCastException: com.kk.COUNTRY не может быть приведен к javax.xml.bind.JAXBElement на main.kk.ClientApp.main (ClientApp.java:31)

+0

java чувствительный к регистру. Я подозреваю, что COUNTRY должен быть com.kk.Country.class –

+0

Является ли 'COUNTRY' корнем xml-файла? – NINCOMPOOP

+0

@Bhavik Shah: нет, это СТРАНА – user2523808

ответ

2

Это потому, что Unmarshaller.unmarshal(File f) возвращает Object и не JAXBElement.

Вот подпись:

public Object unmarshal(java.io.File f) throws JAXBException; 

Ваше решение должно быть:

COUNTRY value = unmarshaller.unmarshal(new StreamSource(new File("src\\countrydetails.xml")), COUNTRY.class); 
0

Вам не нужно бросить unmarshl результат JAXBElement, это должно быть просто ваш класс COUNTRY, что вы пытаетесь распаковать. Предполагая, что вы правильно аннотированный свой класс COUTNRY, то вы можете просто сделать это:

COUNTRY unmarshal = (COUNTRY) unmarshaller 
      .unmarshal(new File("src\\countrydetails.xml")); 

Следуйте этому учебник, чтобы узнать о JAXB сортировочных и демаршаллизации через простой пример:

http://www.mkyong.com/java/jaxb-hello-world-example/

2

Поскольку ваш COUNTRY класс аннотированный @XmlRootElement, это означает, что он однозначно связан с корневым элементом, и результат операции без помех будет COUNTRY

COUNTRY c = (COUNTRY) unmarshaller.unmarshal(xml); 

Если вместо COUNTRY был один или несколько соответствующих @XmlElementDecl аннотаций или вы использовали unmarshal метод, который принял параметр Class вы получите экземпляр JAXBElement

JAXBElement<COUNTRY> c = unmarshaller.unmarshal(xml, COUNTRY.class); 

Для получения более подробной информации

 Смежные вопросы

  • Нет связанных вопросов^_^