首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAXB继承动态命名标记

JAXB继承动态命名标记
EN

Stack Overflow用户
提问于 2016-11-20 18:18:59
回答 2查看 231关注 0票数 0

我正在处理一个配置XML文件,我希望它是动态的。

我有以下课程:

仓库:

代码语言:javascript
复制
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "repository")
public class Repository
        implements Serializable
{

    @XmlElement(name = "custom-configuration")
    private CustomConfiguration customConfiguration;

    ...
    // Constructor

    // Getters and setters
}

CustomConfiguration:

代码语言:javascript
复制
@XmlAccessorType(XmlAccessType.FIELD)
public class CustomConfiguration
{
}

FooBarConfiguration:

代码语言:javascript
复制
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "foo-bar-configuration")
public class FooBarConfiguration extends CustomConfiguration
{

    @XmlAttribute
    private String bucket;

    @XmlAttribute
    private String key;


    public FooBarConfiguration()
    {
    }

    public String getBucket()
    {
        return bucket;
    }

    public void setBucket(String bucket)
    {
        this.bucket = bucket;
    }

    public String getKey()
    {
        return key;
    }

    public void setKey(String key)
    {
        this.key = key;
    }

}

这就是我想要的:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<repository id="test-repository">
    <foo-bar-configuration bucket="test-bucket" key="test-key"/>
    <group/>
</repository>

相反,我得到的是:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<repository id="test-repository">
    <customConfiguration xsi:type="fooBarConfiguration" bucket="test-bucket" key="test-key" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
    <group/>
</repository>

有什么办法可以做到吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-21 11:58:58

按照要求,这里是一个真实世界的例子。

一些基本类型的模式声明和抽象元素

代码语言:javascript
复制
   <xsd:element name="AbstractQueryExpression"
                type="fes:AbstractQueryExpressionType" abstract="true"/>

它就是这样使用的

代码语言:javascript
复制
   <xsd:complexType name="GetPropertyValueType">
      <xsd:complexContent>
         <xsd:extension base="wfs:BaseRequestType">
            <xsd:sequence>
               <xsd:element ref="fes:AbstractQueryExpression"/>
            </xsd:sequence>
            <xsd:attribute name="valueReference" type="xsd:string"
               use="required"/>
            <xsd:attribute name="resolvePath" type="xsd:string"/>
            <xsd:attributeGroup ref="wfs:StandardPresentationParameters"/>
            <xsd:attributeGroup ref="wfs:StandardResolveParameters"/>
         </xsd:extension>
      </xsd:complexContent>
   </xsd:complexType>

这将产生以下Java代码:

代码语言:javascript
复制
@XmlElementRef(name = "AbstractQueryExpression", namespace = "http://www.opengis.net/fes/2.0", type = JAXBElement.class)
protected JAXBElement<?> abstractQueryExpression;

另一个模式声明一个可以替换原始元素的元素。

代码语言:javascript
复制
   <xsd:element name="StoredQuery" type="wfs:StoredQueryType"
      substitutionGroup="fes:AbstractQueryExpression"/>

ObjectFactory中,如下所示:

代码语言:javascript
复制
@XmlElementDecl(namespace = "http://www.opengis.net/wfs/2.0", name = "StoredQuery", substitutionHeadNamespace = "http://www.opengis.net/fes/2.0", substitutionHeadName = "AbstractQueryExpression")
public JAXBElement<StoredQueryType> createStoredQuery(StoredQueryType value) {
    return new JAXBElement<StoredQueryType>(_StoredQuery_QNAME, StoredQueryType.class, null, value);
}

这一机制可用于实现“扩展点”。您可以声明和使用一个抽象/泛型的“替换头”元素,而在其他模式中,特定的元素可以替换它。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2016-11-20 19:02:08

您应该能够使用@XmlElementRef按元素名称进行封送,例如:

代码语言:javascript
复制
@XmlElementRef
private CustomConfiguration customConfiguration;

下面是Blaise的一个例子:http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-substitution.html

Javadoc:https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/annotation/XmlElementRef.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40707661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档