Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXBException:SaveButton及其任何超类在此上下文中都是未知的_Java_Jaxb - Fatal编程技术网

Java JAXBException:SaveButton及其任何超类在此上下文中都是未知的

Java JAXBException:SaveButton及其任何超类在此上下文中都是未知的,java,jaxb,Java,Jaxb,关于这个问题,我读了好几篇文章,但似乎没有一篇能回答我的具体问题。在包“settings”中,我有一个SettingModel.java类,它使用jaxb从default.xml文件加载默认设置。这是完美的。然后,在同一个包下,在名为SettingsWidgets的子包中,我有一个SaveButton.java类,它有一个setOnMouseClickeventListener,触发了一个方法“saveSettings”。代码部分工作:当前文件被覆盖(虽然为void),或者在所需的包中创建了一个

关于这个问题,我读了好几篇文章,但似乎没有一篇能回答我的具体问题。在包“settings”中,我有一个
SettingModel.java
类,它使用jaxb从
default.xml
文件加载默认设置。这是完美的。然后,在同一个包下,在名为
SettingsWidgets
的子包中,我有一个
SaveButton.java
类,它有一个
setOnMouseClick
eventListener,触发了一个方法“saveSettings”。代码部分工作:当前文件被覆盖(虽然为void),或者在所需的包中创建了一个新的(但为空)xml文件,我得到了错误

javax.xml.bind.JAXBException: class settings.settingsWidgets.SaveButton nor any of its super class is known to this context.

我已经尝试过:
按照Stack O上几个线程中的建议,以不同的方式创建JAXBContext(将包作为字符串传递,并添加jaxb.index和ObjectFactory.java,传递完整的类路径,而不仅仅是类,…),但没有成功,我觉得(阅读错误)问题不在于如何将SettingsModel类传递到上下文…
@xmlseea解决方案也经常被提及,但在我的案例中,我没有立即看到它的任何用途(这不是我试图封送子类或smth)
还尝试从子包中重构
SaveButton.java
,使其与
setingsModel
处于同一级别,但这并没有改变任何东西…
我对如何以及为什么应该将
SaveButton
包含到
jaxbContext
中感到非常困惑,当我尝试时,会出现很多错误


我的代码:

//SettingsModel.java
@XmlRootElement(name=“robot”)
@XmlAccessorType(XmlAccessType.FIELD)
公共类设置模型实现了可观察的{
private boolean valid=true;
//注册视图列表
//注释为Type Object.Class,因为JAXB无法处理接口
@XmlElement(类型=Object.class)
私人ArrayList ListenerList;
//列出所有可变机器人/车辆规格
//需要文件名才能保存到当前文件或新文件
@xmlement(name=“filename”)
私有字符串文件名;
@XmlElement(name=“车辆宽度”)
私人双程车;
@XmlElement(name=“工作宽度”)
私人双工作宽度;
//其他没有逻辑的getter和setter被删除
public void setValid(布尔有效){
if(有效!=this.valid){
this.valid=有效;
FireInvalizationEvent();
}
}
公共无效设置车辆宽度(双车辆宽度){
this.vehicleWidth=车辆宽度;
Field.getInstance().getRobot().setVehicleWidth(vehicleWidth);
FireInvalizationEvent();
}
公共无效设置工作宽度(双工作宽度){
this.workWidth=工作宽度;
//Field.getInstance().getRobot().setVehicleWidth(vehicleWidth);
//FireInvalizationEvent();
}
//方法和功能
@凌驾
public void addListener(invalizationListener invalizationListener){
添加(InvalizationListener);
}
@凌驾
公共void RemovelListener(InvalizationListener InvalizationListener){
ListenerList.remove(InvalizationListener);
}
公共无效FireInvalizationEvent(){
for(无效侦听器:侦听器列表){
无效(这个);
}
}
}
//SaveButton.java
公共类SaveButton扩展按钮实现InvalizationListener{
私有设置模型;
公共保存按钮(设置模型){
this.model=模型;
addListener(this);
setText(“保存设置”);
setOnMouseClicked((ev)->{
试一试{
保存设置();
}捕获(JAXBEException e){
e、 printStackTrace();
}catch(filenotfounde异常){
e、 printStackTrace();
}
});
}
private void saveSettings()引发JAXBEException,FileNotFoundException{
字符串filename=model.getFileName();
对象[]选项={“保存”,“另存为”};
//选择“保存”或“另存为”
int choice=JOptionPane.showOptionDialog(null,“覆盖当前文件还是另存为新文件?”,
“保存设置”,
JOptionPane.WARNING_消息,
JOptionPane.YES\u NO\u选项,
无效的
选项,
选项[0]
);
if(选项!=JOptionPane.OK\u选项){
filename=JOptionPane.showInputDialog(“输入新文件名”);
model.setFileName(文件名);
}
System.out.println(model.getFileName());
//元帅
JAXBContext JAXBContext=JAXBContext.newInstance(SettingsModel.class);
Marshaller jaxbMarshaller=jaxbContext.createMarshaller();
//若文件名保持不变,那个么文件将被覆盖。只测试“另存为”,直到代码运行时才丢失默认文件
File File=新文件(“src/resources/properties/”+filename+“.xml”);
OutputStream os=新文件OutputStream(文件);
jaxbMarshaller.marshal(模型,操作系统);
}
@凌驾
公共无效(可观察到){
System.out.println(“按钮无效:”+model.isValid());
setDisable(!model.isValid());
}
}

堆栈跟踪:

javax.xml.bind.MarshalException
 - with linked exception:
[com.sun.istack.SAXException2: javax.xml.bind.JAXBException: class settings.settingsWidgets.SaveButton nor any of its super class is known to this context.
javax.xml.bind.JAXBException: class settings.settingsWidgets.SaveButton nor any of its super class is known to this context.]
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:301)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:226)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:80)
    at settings.settingsWidgets.SaveButton.saveSettings(SaveButton.java:59)
    at settings.settingsWidgets.SaveButton.lambda$new$0(SaveButton.java:27)
    at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.base/javafx.event.Event.fireEvent(Event.java:198)
    at javafx.graphics/javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3564)
    at javafx.graphics/javafx.scene.Scene$ClickGenerator.access$8200(Scene.java:3492)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Scene.java:3860)
    at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1200(Scene.java:3579)
    at javafx.graphics/javafx.scene.Scene.processMouseEvent(Scene.java:1849)
    at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2588)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:397)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(GlassViewEventHandler.java:434)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:390)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:433)
    at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(View.java:556)
    at javafx.graphics/com.sun.glass.ui.View.notifyMouse(View.java:942)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: com.sun.istack.SAXException2: javax.xml.bind.JAXBException: class settings.settingsWidgets.SaveButton nor any of its super class is known to this context.
javax.xml.bind.JAXBException: class settings.settingsWidgets.SaveButton nor any of its super class is known to this context.
    at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:217)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:232)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:623)
    at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:39)
    at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:142)
    at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:129)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:329)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:563)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:310)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:464)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:298)
    ... 34 more
Caused by: javax.xml.bind.JAXBException: class settings.settingsWidgets.SaveButton nor any of its super class is known to this context.
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:563)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:618)
    ... 42 more

Process finished with exit code 0

如果您有任何见解,我们将不胜感激。

您的设置模型有一个标记为xmlelement的listenerList。您可以使用以下行将SaveButton添加到此列表中:
model.addListener(这个)

因此,在整理SettingsModel时,JAXB处理listenerList并尝试整理SaveButton,但它不知道如何做

向SaveButton类添加@XmlRootElement注释就足够了

此外,我看到每次单击按钮时都会创建一个JAXBContext。JAXB规范说: