JAXB Unmarshalling из XML-файла в JLIST

1

Я очень новичок в сортировке и разборке. Мне нужно сохранить и загрузить файл xml в моей программе. Сначала я отправлю свой класс оболочки.

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;


//Class created to wrap the list of pc parts on the right Jlist. 
@XmlRootElement

public class JlistWrapper {
    private List<String> Pcpart;

    @XmlElement(name = "Pcpart")
    public List<String> getPcParts(){
    return Pcpart;
    }
    public void setPcparts(List<String> Pcpart){
        this.Pcpart = Pcpart;
    }
}

Теперь вот мой метод save(), который работает:

public static void save(File file) throws Exception{


    for (int i = 0; i < computerParts1.size(); i++){
        save.add((String)computerParts1.getElementAt(i));
    }

    //wrapping Jlist data
    JlistWrapper wrapper = new JlistWrapper();
    wrapper.setPcparts(save);

    JAXBContext c = JAXBContext.newInstance(JlistWrapper.class);
    Marshaller m = c.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    m.marshal(wrapper, file);   


}

Для моего метода сохранения у меня первоначально была последняя строка, установленная таким образом, чтобы просто выводить xml на консоль. Но я не знал, как отмахиваться оттуда (какие-то идеи по этому поводу?).

m.marshal(wrapper, System.out); 

Теперь, наконец, мой метод load(), который я не могу правильно развязать...

public static void load(File file) throws JAXBException{
    JAXBContext context = JAXBContext.newInstance(JlistWrapper.class);
    Unmarshaller unmar = context.createUnmarshaller();

    //Read XML from file
    JlistWrapper wrapper = (JlistWrapper) unmar.unmarshal(file);
    save.clear();
    save.addAll(wrapper.getPcParts());





}

И вот ошибка, которую я получаю, когда я нажимаю кнопку загрузки:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.reflect.Lister$CollectionLister.addToPack(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Scope.add(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty$ReceiverImpl.receive(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.endElement(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.endElement(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
at com.cooksys.assessment.Window.load(Window.java:236)
at com.cooksys.assessment.Window$2.actionPerformed(Window.java:149)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Дайте мне знать, если что-то еще вам нужно, чтобы ответить на мой вопрос. Спасибо заранее!

EDIT: Я забыл уточнить, что мне нужно развязать список объектов в JList в моем графическом интерфейсе. Sofar Я могу только сохранить список объектов из JList в xml.

  • 0
    Вы можете сказать, какую линию вы получаете NPL?
  • 0
    К сожалению, я не могу.
Теги:
jaxb

1 ответ

1
Лучший ответ

Вы должны убедиться, что getPcParts не возвращает null, либо путем инициализации поля, либо путем создания ленивого init в getter:

@XmlElement(name = "Pcpart")
public List<String> getPcParts(){
  if(Pcpart == null) {
    Pcpart = new ArrayList<String>();
  }
  return Pcpart;
}

То, как списки Unmarshals JAXB немного необычны - он не вызывает setter, вместо этого он предполагает, что getter возвращает изменчивый список, к которому он может добавить. Несмешитель по существу делает

theObj.getPcParts().add(theStringValueFromXml)

для каждого элемента Pcpart в XML.

  • 0
    ЗДОРОВО! Спасибо! Это сработало!
  • 0
    Большое спасибо за это. JAXB просто так сильно ненавидит неизменность!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню