JAXB将@XmlElementRefs和@XmlElements转换为xs:choice

 手机用户新常态 发布于 2023-02-07 10:38

我有4节课.Person类和抽象ContactInformationPhoneAddress类扩展它.

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Person {
    @XmlElement(required = true, nillable = false)
    private String first;
    @XmlElement(required = true, nillable = false)
    private String last;
    @XmlElementWrapper(name = "contacts")
    @XmlElementRefs({
        @XmlElementRef(name = "phone", type = Phone.class, required = true),
        @XmlElementRef(name = "address", type = Address.class, required = true)
    })
    private final List contacts = new ArrayList<>();
}

ContactInformation 仅用作容器:

public abstract class ContactInfomation { /* empty class */ }

Phone 类:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Phone extends ContactInfomation {
    @XmlElement(required = true, nillable = false)
    private String number;
}

Address班级:

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Address extends ContactInfomation {
    @XmlElement(required = true, nillable = false)
    private String country;
    @XmlElement(required = true, nillable = false)
    private String city;
}

问题是,当我换@XmlElementrefs@XmlElementsPerson类,没有任何反应.JAXB将它们映射到xs:choice.XML输出与以前相同,并schemagen生成与以前相同的模式.这是一个示例输出:



    majid
    azimi
    
        
US Los Angles
US New York
5551037

这是架构:




  

  

  

  
    
      
      
      
        
          
            
              
              
            
          
        
      
    
  

  
    
      
        
          
        
      
    
  

  
    
  

  
    
      
        
          
          
        
      
    
  

文档的@XmlElementRef使用它来替换组和XML的选择.我完全混淆@XmlElementRefs/ @XmlElementRef@XmlElements/ 的区别是什么@XmlElement.有人可以帮忙吗?

1 个回答
  • TL; DR

    之间的基本Differenece @XmlElement@XmlElementRef

    @XmlElement和之间的区别在于,@XmlElementRef相应的生成元素是否包含本地元素定义或对全局元素定义的引用.

    选择和替代团体

    XML Schema中的选择实际上是替换组可以完成的超集.因此,为了简化映射,JAXB利用两个映射.

    JAXB和Schema Generation

    JAXB可以从任何XML Schema生成Java模型,另一方面JAXB不保留有关XML模式的所有元数据.因此,JAXB无法生成每个XML架构.


    @XmlElementRefs/ @XmlElementRef@XmlRootElement

    以下是您的模型中的内容.

    我已经修改了contacts字段上的映射,使得到Address类的映射更加清晰.

    @XmlElementWrapper(name = "contacts")
    @XmlElementRefs({
        @XmlElementRef(name = "phone", type = Phone.class, required = true),
        @XmlElementRef(name = "ADDRESS", type = Address.class, required = true)
    })
    private final List<ContactInfomation> contacts = new ArrayList<>();
    

    电话

    使用@XmlElementRef您指定的信息进行映射时,需要与由@XmlRootElementor 提供的全局元素定义相对应@XmlElementDecl(请参阅:http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html).默认情况下,Person类的根元素为person.

    @XmlRootElement
    public class Person {
    

    地址

    我使用了@XmlRootElement注释覆盖了默认名称Address class.

    @XmlRootElement(name="ADDRESS")
    public class Address extends ContactInfomation {
    

    生成的XML架构

    这是生成的架构.我们看到结构中的element定义choice利用ref引用现有元素而不是定义局部元素.

      <xs:element name="contacts" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element ref="phone"/>
              <xs:element ref="ADDRESS"/>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    

    @XmlElements/@XmlElement

    我已经更改了您contacts要使用的字段上的映射@XmlElements.

    @XmlElementWrapper(name = "contacts")
    @XmlElements({
        @XmlElement(name = "phone-number", type = Phone.class, required = true),
        @XmlElement(name = "home-address", type = Address.class, required = true)
    })
    private final List<ContactInfomation> contacts = new ArrayList<>();
    

    电话

    所有引用的类都不需要注释@XmlRootElement(或具有相应的@XmlElementDecl注释.

    public class Phone extends ContactInfomation {
    

    地址

    如果他的类确实有@XmlRootElement注释,则不需要匹配@XmlElement注释@XmlElements.

    @XmlRootElement(name="ADDRESS")
    public class Address extends ContactInfomation {
    

    生成的XML架构

    这是生成的架构.我们看到,element在中定义choice的结构现在被定义为本地元素.

      <xs:element name="contacts" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:choice maxOccurs="unbounded">
              <xs:element name="phone-number" type="phone"/>
              <xs:element name="home-address" type="address"/>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    

    2023-02-07 10:39 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有