JAXB解组不需要';当字段声明为列表但不';如果将同一字段声明为ArrayList,则无法工作

JAXB解组不需要';当字段声明为列表但不';如果将同一字段声明为ArrayList,则无法工作,jaxb,unmarshalling,Jaxb,Unmarshalling,我最近开始编写一个包含一些JAXB可序列化/反序列化类的代码。其中一个类中有几个列表,我想向其中添加一个新列表。列表最初声明为ArrayList。类似地,get方法也返回ArrayList。我把它们都改成了列表,并添加了新的列表和列表。但在那之后,我无法将该对象的xml解组为JAVA对象。当我将字段更改回ArrayList而不做任何其他更改时,解组工作正常。我还尝试将DefaultValidationEventHandler附加到解组器,但它在解组时不会抛出任何错误。下面是类和变量名发生变化时该

我最近开始编写一个包含一些JAXB可序列化/反序列化类的代码。其中一个类中有几个列表,我想向其中添加一个新列表。列表最初声明为ArrayList。类似地,get方法也返回ArrayList。我把它们都改成了列表,并添加了新的列表和列表。但在那之后,我无法将该对象的xml解组为JAVA对象。当我将字段更改回ArrayList而不做任何其他更改时,解组工作正常。我还尝试将DefaultValidationEventHandler附加到解组器,但它在解组时不会抛出任何错误。下面是类和变量名发生变化时该类的外观

@XmlRootElement(name=“commandSet”)
公共类命令集{
专用最终阵列列表xCommands;
私人最终ArrayList yCommands;
@凌驾
@XmlElementWrapper(name=“xCommand”)
@xmlement(name=“xCommand”,type=Command.class)
公共阵列列表getXCommands(){
返回此.xCommands;
}
@凌驾
@xmlementwrapper(name=“yCommands”)
@xmlement(name=“yCommand”,type=Command.class)
公共阵列列表getYCommands(){
返回此.yCommands;
}
}
当xCommands和yCommands被声明为List并且getter也返回List时,取消编排不起作用

在我找到的所有解组列表示例中,人们都使用List而不是ArrayList。你知道为什么列表对我不起作用吗?

我注意到了你的代码 我注意到关于你的代码有一些奇怪的事情,它们可能会也可能不会影响你的问题。至少我怀疑您遇到问题的模型与您在问题中发布的模型不同

  • 您将字段标记为final,但从不初始化它们
  • 您用
    @Override
    注释了这两个
    get
    方法,但由于
    CommandSet
    没有继承任何内容(除了
    对象
    ),因此您没有重写任何内容
完整的工作示例 Java模型 命令集

在这个版本的
命令集
类中,我创建了一个属性类型
ArrayList
,另一个属性类型
List
,以证明它们都可以工作。我还删除了上面提到的代码中的一些奇怪的东西

import java.util.*;
导入javax.xml.bind.annotation.*;
@XmlRootElement
公共类命令集{
专用最终阵列列表xCommands;
私人最终名单和命令;
公共命令集(){
xCommands=newarraylist();
yCommands=newarraylist();
}
@XmlElementWrapper(name=“xCommand”)
@xmlement(name=“xCommand”)
公共阵列列表getXCommands(){
返回此.xCommands;
}
@xmlementwrapper(name=“yCommands”)
@xmlement(name=“yCommand”)
公共列表getYCommands(){
返回此.yCommands;
}
}
命令

公共类命令{
}
演示代码 演示

导入java.io.File;
导入javax.xml.bind.*;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(CommandSet.class);
Unmarshaller Unmarshaller=jc.createUnmarshaller();
File xml=新文件(“input.xml”);
CommandSet CommandSet=(CommandSet)unmarshaller.unmarshal(xml);
Marshaller=jc.createMarshaller();
setProperty(marshaller.JAXB_格式化的_输出,true);
marshaller.marshall(commandSet,System.out);
}
}
input.xml/Output


谢谢您的回复。回答您在代码中注意到的奇怪行为:1。这些字段在实际代码中的构造函数中初始化,正如您在示例中所做的那样。2.该类正在实现一个接口,@Override就是因为这个。我认为项目的设置方式有问题,因为当字段声明为List时,它不起作用。我将尝试创建一个单独的项目来测试它。