jaxb列表中的默认元素命名

时间:2014-10-05 19:38:12

标签: java jaxb

假设我有以下两个类,我希望使用jaxb

进行编组
@XmlRootElement(name = "VirtualizationData")
public class VirtualizationData
{
    @XmlElement(name = "VirtualOrganization")
    public List<VirtualOrganization> Organizations = new ArrayList<VirtualOrganization>();
}

public class VirtualOrganization
{
    public VirtualOrganization(String p_name, String p_id)
    {
        m_name = p_name;
        m_id = p_id;
    }

    @XmlAttribute(name = "Name")
    private String m_name;

    @XmlAttribute(name = "Id")
    private String m_id;
}

这是一个编组的xml

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

我有两个问题 -

  1. 如果删除@XmlRootElement属性的名称部分 - VirtualizationData将成为XML中的virtualizationData。有办法改变吗?毕竟,为什么不使用类名作为默认值?
  2. 如果删除@XmlElement属性的名称部分 - VirtualOrganization将成为组织。同样,为什么不使用类名作为元素名称?如果我需要有许多其他具有VirtualOrganization列表的类,如果我在所有类中都指定相同的名称,或者有没有办法标记VirtualOrganization,那该怎么办?
  3. 感谢。

    更新

    根据词典的回答,我想更多地澄清我的问题。困扰我的是这些注释的冗长以及我在不同的地方有相同的字符串和注释的事实。有人提出这个问题,希望找到一个针对该问题的公约配置式解决方案。有没有办法在jaxb中创建这样的约定?

1 个答案:

答案 0 :(得分:1)

简短回答:不,没有(简单)方法可以在没有注释的情况下进行更改,因为注释是(简单)改变它的方法。

答案很长:

  1. 肯定有可能从Java名称创建元素名称(例如,从这里的类名)。 virtualizationDataVirtualizationDatavirtualization-data都有意义。但是默认情况下必须选择一种方法。如果是这样,VirtualizationData,您可以随时问 - 为什么不virtualizationData
  2. 这里也是一样,但附加的复杂性VirtualOrganization是列表的泛型类型参数。在编译模式时,您可以轻松获得类似List<Serializable>的内容,但Serializables作为元素名称并不真正有意义。因此,我们可以得出结论,集合项类的名称不一定为该属性提供有意义的名称。我认为你不能在VirtualOrganization上定义默认的集合元素名称(如果这是你要问的那样)。
  3. 我上面说过,没有(简单的)方法可以改变它。但这是可行的。您可以编写和配置自己的注释阅读器,它将实现不同的默认命名。但是我肯定不会这样做。只需使用注释即可自定义。