Java jaxb列表中的默认元素命名

Java jaxb列表中的默认元素命名,java,jaxb,Java,Jaxb,假设我有以下两个类,我希望使用jaxb来处理它们 @XmlRootElement(name = "VirtualizationData") public class VirtualizationData { @XmlElement(name = "VirtualOrganization") public List<VirtualOrganization> Organizations = new ArrayList<VirtualOrganization>(

假设我有以下两个类,我希望使用jaxb来处理它们

@XmlRootElement(name = "VirtualizationData")
public class VirtualizationData
{
    @XmlElement(name = "VirtualOrganization")
    public List<VirtualOrganization> Organizations = new ArrayList<VirtualOrganization>();
}
下面是一个编组xml的示例

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<VirtualizationData>
    <VirtualOrganization Name="localhost" Id="555"/>
</VirtualizationData>

我有两个问题-

  • 如果删除@XmlRootElement属性的名称部分,则VirtualizationData将成为XML中的VirtualizationData。有没有办法改变这种状况?毕竟,为什么不使用类名作为默认名称呢
  • 如果删除@XmlElement属性的名称部分,VirtualOrganization将成为组织。同样,为什么不使用类名作为元素名呢?如果我需要有许多其他类包含VirtualOrganization列表,我应该在所有类中指定相同的名称,还是有方法标记VirtualOrganization
  • 谢谢

    更新:


    在lexicore的回答之后,我想进一步澄清我的问题。困扰我的是这些注释的冗长,以及我在不同的地方会有相同的字符串和注释。提出这个问题的目的是希望找到一个超越配置风格的解决方案的约定。有没有办法在jaxb中创建这样的约定

    简短回答:不,没有注释就没有(简单的)方法来改变它,因为注释是改变它的(简单的)方法

    长答覆:

  • 从Java名称(例如,从这里的类名)创建元素名称肯定有很多方法<代码>虚拟化数据,
    虚拟化数据
    虚拟化数据
    都有意义。但默认情况下必须选择一种方法。如果它是,就像你建议的那样,
    VirtualizationData
    ,你总是可以问-为什么不
    VirtualizationData
  • 这里也有同样的情况,但是有一个额外的复杂性,
    VirtualOrganization
    是列表的泛型类型参数。在编译模式时,您可以很容易地获得类似于
    List
    的内容,但是
    Serializables
    作为元素名并没有什么意义。所以我们可以得出结论,集合项类的名称不一定为属性提供有意义的名称。我认为您无法在
    VirtualOrganization
    上定义默认的集合元素名称(如果这是您所要求的)

  • 我在上面说过,没有(简单的)方法可以改变这一点。但这是可行的。您可以编写和配置自己的注释读取器,该读取器将实现不同的默认命名。不过,我绝对不建议这样做。只需使用注释进行自定义。

    我认为您需要对您的案例进行更详细的阐述,或许可以添加示例。您知道可以在注释中使用字符串常量,对吗?如果您有相同的注释结构,是否可以重构Java类?如果没有看到代码,很难说。@lexicore-你说的“如果你有相同的注释结构,有可能重构Java类吗?”是什么意思?例如,如果你在许多类中有
    name
    value
    属性,那么将这些属性提取到一个超类中可能是有意义的。或聚合到聚合类中。@lexicore-确实如此,并且这些属性已经存在于超类中。然而,每次我有一个带有这个超类的列表时,我都需要在XmlElements属性中指定所有可能的内在类,并在添加新的列表时修改所有列表……对不起,理论上讲这有点太难了。如果你能给出具体的例子?那就更容易给出具体的答案了。
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <VirtualizationData>
        <VirtualOrganization Name="localhost" Id="555"/>
    </VirtualizationData>