Я очень новичок в сортировке и разборке. Мне нужно сохранить и загрузить файл 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.
Вы должны убедиться, что 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.