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)


person user2523808    schedule 27.06.2013    source источник
comment
java чувствителен к регистру. Я подозреваю, что COUNTRY должен быть com.kk.Country.class   -  person Bhavik Shah    schedule 27.06.2013
comment
Является ли COUNTRY корнем XML-файла?   -  person AllTooSir    schedule 27.06.2013
comment
@Бхавик Шах: нет, это СТРАНА   -  person user2523808    schedule 27.06.2013
comment
@TheNewIdiot да COUNTRY является корнем xml   -  person user2523808    schedule 27.06.2013


Ответы (3)


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

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

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

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

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

person bdoughan    schedule 27.06.2013

Это потому, что 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);
person Buhake Sindi    schedule 27.06.2013

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

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

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

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

person Juned Ahsan    schedule 27.06.2013