我看了几篇关于这个主题的帖子,但没有一个解决方案对我有用。我有一个名为DefaultListModel
的{{1}},它是我的窗口类的成员,我有一个名为配置的内部类,其中包含partsListRight
,我希望用{{{}}中的项填充1}}:
ArrayList
在我的窗口类中,我有partsListRight
方法为@XmlRootElement
class Configuration{
@XmlElement
private ArrayList<String> Component;
public Configuration(){
Component = new ArrayList<String>();
Object[] partsList = partsListRight.toArray();
for (Object object : partsList){
Component.add((String)object);
}
}
}
组件进行编组:
save()
但是,当我尝试运行此方法时,我得到的错误是Configuration是一个非静态内部类,而JAXB无法处理这些错误。我不知道怎么解决这个问题。非常感谢任何帮助!
答案 0 :(得分:1)
你不需要内心阶级。我可以看到你这样做的原因是因为你想要访问DefaultListModel
,但这是不必要的。你JAXB模型类不应该知道关于任何gui方面的任何信息。它只是意味着建模。
那就是说,你的设计有点偏差。您应该只将Configuration
作为自己的类文件。您也不需要Configuration
类的构造函数。只需getter
List
,然后从save()
方法填充它。类似的东西:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"component"
})
@XmlRootElement(name = "Configuration")
public class Configuration {
protected List<String> component;
public List<String> getComponent() {
if (component == null) {
component = new ArrayList<String>();
}
return this.component;
}
}
然后,当您真正想要进行编组时,只需创建Configuration
类,并使用列表模型元素填充它。
Configuration config = new Configuration();
List<String> list = config.getComponent();
Object[] partsList = partsListRight.toArray();
for (Object object : partsList){
list.add((String)object);
}
JAXBContext context = JAXBContext.newInstance(
Configuration.class.getPackage().getName());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(config, System.out);
<强>更新强>
感谢您的回复;我尝试使用此功能,现在我遇到了新的错误。 javax.xml.bind.JAXBException:无法实例化Provider com.sun.xml.internal.bind.v2.ContextFactory:javax.xml.bind.JAXBException:&#34; com.cooksys.assessment&#34;不包含ObjectFactory.class或jaxb.index ...
抱歉,我已经习惯使用xjc为您创建了ObjectFactory
。在您的情况下,只需使用与JAXBContext
相同的方式创建Configuration.class
,而不是Configuration.class.getPackage().getName();
JAXBContext context = JAXBContext.newInstance(Configuration.class);
<强>测试强>
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class Marshall {
public static void main(String[] args) throws Exception {
JAXBContext context = JAXBContext.newInstance(Configuration.class);
Marshaller marshaller = context.createMarshaller();
Configuration config = new Configuration();
List<String> list = config.getComponent();
list.add("Hello");
list.add("World");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(config, System.out);
}
}
<强>结果强>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Configuration>
<component>Hello</component>
<component>World</component>
</Configuration>
注意:使用当前的注释配置会相同(同样,xjc创建上面的注释: - )
@XmlRootElement(name = "Configuration")
public class Configuration {
@XmlElement
protected List<String> component;
public List<String> getComponent() {
if (component == null) {
component = new ArrayList<String>();
}
return this.component;
}
}