2013-10-09 2 views
1

Я пытаюсь изучить JAXB. Я создал образец, как показано ниже, но во время unmarshalling я получаю исключение. Мои файлы ниже. Можете ли вы помочь мне решить?Как устранить исключение unmarshalling?

AddRequest.java:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "AddRequest", namespace = "http://www.example.org/AddRequest", propOrder = { 
    "first", 
    "sec", 
    "any" 
}) 
public class AddRequest { 

    @XmlElement(name = "First") 
    protected int first; 
    @XmlElement(name = "Sec") 
    protected int sec; 
    @XmlAnyElement(lax = true) 
    protected List<Object> any; 


} 

ObjectFactory.java

@XmlRegistry 
public class ObjectFactory { 

    private final static QName _AddRequest_QNAME = new QName("http://www.example.org/AddRequest", "AddRequest"); 

    public ObjectFactory() { 
    } 


    public AddRequest createAddRequest() { 
     return new AddRequest(); 
    } 


    @XmlElementDecl(namespace = "http://www.example.org/AddRequest", name = "AddRequest") 
    public JAXBElement<AddRequest> createAddRequest(AddRequest value) { 
     return new JAXBElement<AddRequest>(_AddRequest_QNAME, AddRequest.class, null, value); 
    } 

} 

package-info.java

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/AddRequest", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package org.example.addrequest; 

Main.java

try { 

      File file = new File("C:\\Users\\nbkyooh\\IBM\\rationalsdp\\workspace\\Sample\\resource\\AddRequest.xml"); 
      JAXBContext jaxbContext = JAXBContext.newInstance(org.example.addrequest.AddRequest.class); 

      Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
      jaxbUnmarshaller.unmarshal(file); 

     } catch (JAXBException e) { 
      e.printStackTrace(); 
     } 

AddRequest.xml

<?xml version="1.0" encoding="UTF-8"?> 
<tns:AddRequest xmlns:tns="http://www.example.org/AddRequest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/AddRequest AddRequest.xsd "> 
    <tns:First>0</tns:First> 
    <tns:Sec>0</tns:Sec> 
</tns:AddRequest> 

Я получаю исключение, как показано ниже, то, что я сделал неправильно. Я использовал все сгенерированные файлы.

javax.xml.bind.UnmarshalException: Unexpected element "{http://www.example.org/AddRequest}AddRequest". Expected elements are "". 
    at com.ibm.xml.xlxp2.jaxb.msg.JAXBMessageProvider.throwUnmarshalExceptionWrapper(JAXBMessageProvider.java:93) 
    at com.ibm.xml.xlxp2.jaxb.unmarshal.impl.DeserializationContext.handleSkippedRootElementEvent(DeserializationContext.java:318) 
    at com.ibm.xml.xlxp2.jaxb.unmarshal.impl.JAXBDocumentScanner.produceRootElementEvent(JAXBDocumentScanner.java:189) 

ответ

0

попробовать это:

try { 
     FileInputStream inputStream = new FileInputStream(new File("your file")); 
     AddRequest req = JAXB.unmarshal(inputStream, AddRequest.class); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
+0

Это тоже работает. Но я не мог понять. Почему мой код не работает. – Manoj

+0

@Manoj - Это поможет вам он выводится без изменений, но он не будет обрабатывать класс ObjectFactory, который может вызывать различные проблемы на основе вашей модели. –

1

В вашем случае использования вы должны определить информацию корневого элемента Усиливая @XmlElementDecl аннотации на ObjectFactory класса с аннотацией @XmlRegistry (см: http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html). Поскольку класс, аннотированный с помощью @XmlRegistry, можно назвать чем угодно, и JAXB не выполняет сканирование пакетов, вам необходимо включить ObjectFactory в качестве одного из классов, прошедших в bootstrap JAXBContext.

JAXBContext.newInstance(AddRequest.class, ObjectFactory.class); 

Поскольку ссылки ObjectFactory класса AddRequest вы могли бы упростить это вниз:

JAXBContext.newInstance(ObjectFactory.class); 
+0

На самом деле, оба работают. Как это сделать, если у меня другая схема. Если у меня есть другая схема, которая также будет иметь объект Factory. Как jaxb знает об этом.? – Manoj

+0

@Manoj - Если ваша модель JAXB была создана из XML-схемы, тогда вы должны создать 'JAXBContext' для сгенерированного имени пакета (например,' JAXBContext.newInstance ("com.example.foo"); '. Это приведет к 'JAXBContext' обрабатывается автоматически.Если вы создаете' JAXBContext' на классах, вам нужно включить класс 'ObjectFactory', как в моем ответе. –

+0

Ваш ответ действительно полезен. У меня был другой пакет, сгенерированный с помощью другой схемы. В настоящее время все мое обучение предназначено для службы Rest Apache CXF. На самом деле, cxf сам unmarshall xml с порожденными классами и дает мне объект. В этом случае, как мне сделать cxf know о моих других пакетах? – Manoj

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