我有一个可观察的 class 清单 . 使用以下内容编组此列表

public void saveBillsToFile(File file){
    try{    
        JAXBContext context = JAXBContext
                .newInstance(BillListWrapper.class);
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        BillListWrapper wrapper = new BillListWrapper();
        wrapper.setBills(budget.getBills());

        m.marshal(wrapper, file);

        //TODO setPersonFilePath(file);
    }catch(Exception e){
        e.printStackTrace(System.out);
    }

但是,当我向Bill类添加LocalDate对象属性时,我得到NoSuchMethodException . 我发现一篇帖子说我需要创建一个XML适配器

public class LocalDateAdapter extends XmlAdapter<String, LocalDate> {
public LocalDate unmarshal(String v) throws Exception {
    return LocalDate.parse(v);
}

public String marshal(LocalDate v) throws Exception {
    return v.toString();
}
}

我不确定在哪里放这个 . 我假设它与我的包装器有关

@XmlRootElement(name = "bills")
public class BillListWrapper {

private List<Bill> bills;

@XmlElement(name = "bill")
public List<Bill> getBills() {
    return bills;
}

public void setBills(List<Bill> bills) {
    this.bills = bills;
}

票据类:

public class Bill{

//Properties
private StringProperty name = new SimpleStringProperty();
private StringProperty description = new SimpleStringProperty();
private IntegerProperty amount = new SimpleIntegerProperty();
private IntegerProperty payable = new SimpleIntegerProperty();
private IntegerProperty allocatedAmount = new SimpleIntegerProperty();
private IntegerProperty owedAmount = new SimpleIntegerProperty();
private IntegerProperty priority = new SimpleIntegerProperty();
private IntegerProperty recurrence = new SimpleIntegerProperty();
private StringProperty payments = new SimpleStringProperty();
//private ObjectProperty<LocalDate> lastPayment = new SimpleObjectProperty<LocalDate>();
int originalAmount;
int originalOwed;


public Bill(){
    name.set("");
    amount.set(0);
    owedAmount.set(0);
    allocatedAmount.set(0);
    description.set("");
    payments.set("");
    originalAmount = 0;
}

public void allocate(int allocation){
    System.out.println(allocation);
    allocatedAmount.set(originalAmount + allocation);
    if(allocation > amount.get()){
        owedAmount.set(originalOwed - allocation + amount.get());
    }else if(allocation < amount.get()){
        owedAmount.set(originalOwed - allocation + amount.get());
    }else if(allocation == amount.get()){
        owedAmount.set(originalOwed);
    }

}

public void pay(){
    if(payable.get() <= allocatedAmount.get()){
        allocatedAmount.set(allocatedAmount.get() - payable.get());
    }else{
        Alert alert = new Alert(AlertType.ERROR);
        alert.setTitle("Error!");
        alert.setHeaderText("Can't Pay");
        alert.setContentText("There is not enough money allocated to pay this.\nChange the value and try again.");

        alert.showAndWait();
    }
}
 //Getters and setters removed

堆栈跟踪:

(java:15134):Gtk-WARNING **:无法在module_path中找到主题引擎:“adwaita”,2017年7月19日下午4:12:01 com.sun.xml.internal.bind.v2.ClassFactory create0 INFO :没有在类java.time.LocalDate java.lang.NoSuchMethodException上找到的默认构造函数:java.lang.Class.Cons.DeclaredConstructor中的java.lang.Class.getConstructor0(Class.java:3082)中的java.time.LocalDate . () Class.java:2178)com.sun.xml.internal.bind.v2.ClassFactory.create0(ClassFactory.java:89)at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.createInstance(ClassBeanInfoImpl . java:270)at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(UnmarshallingContext.java:684)at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StructureLoader . startElement(StructureLoader.java:171)位于com.sun.xml.internal.bind.v2.runtime的com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:559) . unmarshaller.UnmarshallingContext.startElem ent(UnmarshallingContext.java:538)位于com.sun.org.apind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153)的com.sun.org.apache.xerces.internal.parsers . AbstractSAXParser.startElement(AbstractSAXParser.java:509)位于com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:182)的com.sun.org.apache.xerces.internal.impl . XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:351)位于com.sun.org.apache上的com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl $ FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784) . impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)位于com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)的com.sun.org.apache.xerces.internal . com.sun.org.apache.xerces.inter中的impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505) nal.parsers.XML11Configuration.parse(XML11Configuration.java:841)位于com.sun.org.apache.xerces上的com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770) . internal.sparsers.XMLParser.parse(XMLParser.java:141)at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)at com.sun.org.apache.xerces . 在com.sun.xml的com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:243)的internal.jaxp.SAXParserImpl $ JAXPSAXParser.parse(SAXParserImpl.java:643) . internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214)位于javax.xml.bind.helpers.AbstractUnmarshallerImpl的javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157) . unmarshal(AbstractUnmarshallerImpl.java:162)at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171)at javax.xml.bind.helpers.AbstractUnmarshallerImp l.unmarshal(AbstractUnmarshallerImpl.java:189)在budget.Main.loadBillsFromFile(Main.java:62)的budget.Main.start(Main.java:39)at com.sun.javafx.application.LauncherImpl.lambda $ launchApplication1 $ com(LauncherImpl.java:863)at com.sun.javafx.application.PlatformImpl.lambda $ runAndWait $ 119(PlatformImpl.java:326)at com.sun.javafx.application.PlatformImpl.lambda $ null $ 117(PlatformImpl.java: 295)java.sse.javafx.application.PlatformImpl.lambda上的java.security.AccessController.doPrivileged(Native Method)com.sun.glass.ui.InvokeLaterDispatcher $ Future.run上的$ runLater $ 118(PlatformImpl.java:294) (InvokeLaterDispatcher.java:95)at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)at com.sun.glass.ui.gtk.GtkApplication.lambda $ null $ 450(GtkApplication.java:139)at at java.lang.Thread.run(Thread.java:748)sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)中的Application start方法java.lang.reflect.InvocationTargetException中的异常sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at com.sun位于sun.reflect的sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)的com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)中的.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389) .nativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at sun.launcher.LauncherHelper $ FXHelper.main(LauncherHelper.java:767)引起:java.lang.RuntimeException:com.sun.javafxx中com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)的Application start方法中的异常 . application.LauncherImpl.lambda $ launchApplication $ 99(LauncherImpl.java :182)at java.lang.Thread.run(Thread.java:748)引起:java.lang.NoSuchMethodError:java.stime.Lind . ( . )at com.sun.xml.internal.bind.v2.ClassFactory . create.com(ClassFactory.java:96)位于com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.createInstance(ClassBeanInfoImpl.java:270)的com.sun.xml.internal.bind.v2.runtime.unmarshaller . UnmarshallingContext.createInstance(UnmarshallingContext.java:684)位于com.sun.xml.internal.bind.v2的com.sun.xml.internal.bind.v2.runtime.unmarshaller.StructureLoader.startElement(StructureLoader.java:171) . run.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:559)位于com.sun.xml.internal的com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:538) . com.sun.org上的com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)中的bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153) . apache.xerces.internal.pars ers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:182)位于com.sun.org.apache.erache.inmpl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:351)的com.sun.org.apache.xerces.internal . 位于com.sun.org.apache.xerces的com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)中的impl.XMLDocumentFragmentScannerImpl $ FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784) . 在com.sun.org.apache.xerces的com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)中的internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112) . 在com.sun.org.apache.xerces的com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:770)中的internal.parsers.XML11Configuration.parse(XML11Configuration.java:841) . com.un.org.apache.xerces.interna上的internal.parsers.XMLParser.parse(XMLParser.java:141) l.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)位于com.sun.xml.internal的com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl $ JAXPSAXParser.parse(SAXParserImpl.java:643) . bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:243)位于javax.xml的com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214) . bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)位于javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162)的javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java: 171)位于com的budget.Main.start(Main.java:39)的budget.Main.loadBillsFromFile(Main.java:62)的javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189) . sun.javafx.application.LauncherImpl.lambda $ launchApplication1 $ 106(LauncherImpl.java:863)at com.sun.javafx.application.PlatformImpl.lambda $ runAndWai来自com.sun.javafx的java.security.AccessController.doPrivileged(Native Method)的com.sun.javafx.application.PlatformImpl.lambda $ null $ 117(PlatformImpl.java:295)上的$ 119(PlatformImpl.java:326) . application.PlatformImpl.lambda $ runLater $ 118(PlatformImpl.java:294)at com.sun.glass.ui.InvokeLaterDispatcher $ Future.run(InvokeLaterDispatcher.java:95)at com.sun.glass.ui.gtk.GtkApplication._runLoop (本地方法)at com.sun.glass.ui.gtk.GtkApplication.lambda $ null $ 450(GtkApplication.java:139)... 1更多由以下引起:java.lang.NoSuchMethodException:java.lang.Class.Cons.Dat . (java.lang.Cattructor)的java.lang.Class.Cons.DeclaredConstructor(Class.java:2178)的java.lang.Class.Constructor0( . sun.xml.internal.bind.v2.ClassFactory.create0(ClassFactory.java:89)... 35更多异常运行应用程序预算 . 主要