Marshal将DefaultListModel转换为xml

时间:2014-09-17 18:22:27

标签: java xml jaxb jlist defaultlistmodel

我看了几篇关于这个主题的帖子,但没有一个解决方案对我有用。我有一个名为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无法处理这些错误。我不知道怎么解决这个问题。非常感谢任何帮助!

1 个答案:

答案 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.in​​dex ...

抱歉,我已经习惯使用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;
    }
}