【问题标题】:JAVA JAXB - XJC producing methods returning List<Object> - best way to detect object type?JAVA JAXB - XJC 生成方法返回 List<Object> - 检测对象类型的最佳方法?
【发布时间】:2015-07-11 16:22:11
【问题描述】:

我使用 xjc 将 .xsd 架构转换为 Java。然而,作为一个相当复杂的架构,生成的代码让我有些头疼。

在某些情况下,一个元素可以从几个不同但足够相似的复杂类型元素中选择多个子元素。在发生这种情况的情况下,xjc 的 get 方法会返回对 List&lt;object&gt; 的引用。

    @XmlElements({
        @XmlElement(name = "ATTRIBUTE-VALUE-EMBEDDED-DOCUMENT", type = ATTRIBUTEVALUEEMBEDDEDDOCUMENT.class),
        @XmlElement(name = "ATTRIBUTE-VALUE-EMBEDDED-FILE", type = ATTRIBUTEVALUEEMBEDDEDFILE.class),
        @XmlElement(name = "ATTRIBUTE-VALUE-ENUMERATION", type = ATTRIBUTEVALUEENUMERATION.class),
        @XmlElement(name = "ATTRIBUTE-VALUE-FILE-REFERENCE", type = ATTRIBUTEVALUEFILEREFERENCE.class),
        @XmlElement(name = "ATTRIBUTE-VALUE-SIMPLE", type = ATTRIBUTEVALUESIMPLE.class),
        @XmlElement(name = "ATTRIBUTE-VALUE-XML-DATA", type = ATTRIBUTEVALUEXMLDATA.class)
    })
    protected List<Object> attributevalues;

    /**
     * Gets the value of the attributevalues property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the attributevalues property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getATTRIBUTEVALUES().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link ATTRIBUTEVALUEEMBEDDEDDOCUMENT }
     * {@link ATTRIBUTEVALUEEMBEDDEDFILE }
     * {@link ATTRIBUTEVALUEENUMERATION }
     * {@link ATTRIBUTEVALUEFILEREFERENCE }
     * {@link ATTRIBUTEVALUESIMPLE }
     * {@link ATTRIBUTEVALUEXMLDATA }
     * 
     * 
     */
    public List<Object> getATTRIBUTEVALUES() {
        if (attributevalues == null) {
            attributevalues = new ArrayList<Object>();
        }
        return this.attributevalues;
    }

这让生活变得困难,因为我只对它可能包含的选择中的特定类型的元素感兴趣。

有什么方法可以让我在浏览列表时找出孩子的元素名称?我知道instanceofObject.getClass(),但有人告诉我在绝大多数情况下应该有比它们更好的方法。

这是我应该使用它们的情况之一,还是 JAXB 有一个工具可以检测元素名称而不使用它们中的任何一个?

【问题讨论】:

  • 考虑使用JAXB2 Simplify Plugin 来简化生成的结构。您可以为每个元素获得一个属性,这将使您的生活更简单。免责声明:我是插件的作者。
  • @lexicore 还没有机会查看它,但是一旦我的所有功能都正常工作并正在调整算法,我肯定会试一试。

标签: java xml list object jaxb


【解决方案1】:

在这种情况下,instanceof 可能是您最好的选择。也就是说,如果所有元素都有一个共同的结构,您可以为它们创建一个共同的界面。您可以将绑定添加到模式中,以使 xjc 将接口分配给相关类。那么您的列表应该是通用接口,而不仅仅是 Object。但是,如果没有任何额外的属性来区分类,那么您仍然需要使用“instanceof”来查找相关类型。

您可能会说服 jaxb 告诉您给定对象实例的元素名称(例如 JAXBIntrospector),但您的代码仍然只是元素名称的一个巨大开关,这与巨大的 instanceof 开关。

【讨论】:

  • 我没有创建架构,所以我无法真正编辑它。我通过它运行 RIF/ReqIF 模式以生成相关类。
  • @ForceGaia - 您可以使用单独的绑定文件来影响 xjc 的行为,而无需直接修改架构(无论您是否修改架构仅仅是为了影响生成的类,这并不重要)。
猜你喜欢
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2022-07-11
  • 2012-05-04
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多