JAXB忽略内部元素

问题描述:

我一直在试图将自我创建的xml配置文件解组为一个JAXB默认实现的对象,我忽略了原因,但是一些内部元素和值被略过给我空结果。JAXB忽略内部元素

这里是XML文档:

<import-sources> 
    <domain-objects> 
     <domain-object class="xxx.xxx.core.business.mapping.Make"> 
      <sources> 
       <source name="xxxxxx" class="xxx.xxx.core.web.common.model.xxxxxxx.output.MakeDTO"> 
        <uri secured="true" value="xxxxxxxxxxxxxxxxxx"/> 
        <key name="api_key" mode="in_uri" value="xxxxxxxxxxxx"/> 
       </source> 
      </sources> 
    </domain-object> 
</domain-objects> 

这是映射类:

@XmlRootElement(name = "import-sources") 
public class ImportSources { 

    @XmlType 
    public static class DomainObject { 

     @XmlType 
     public static class Source { 

      @XmlType 
      public static class URI { 

       private String value; 

       private boolean secured; 
      } 

      @XmlType 
      public static class Key { 

       @XmlEnum 
       public enum Mode { 
        @XmlEnumValue("in_uri") 
        IN_URI, 
        @XmlEnumValue("in_header") 
        IN_HEADER 
       } 

       private String name; 

       private String value; 

       private Mode mode; 
      } 


      private String name; 


      private URI uri; 


      private Key key; 

      @XmlElement(name = "class") 
      private Class outputClass; 
     } 

     @XmlAttribute(name = "class") 
     private Class<? extends Entity> subjectClass; 

     @XmlElementWrapper 
     @XmlElement(name = "source") 
     private Source[] sources; 
    } 

    @XmlElementWrapper(name = "domain-objects") 
    @XmlElement(name = "domain-object") 
    private DomainObject[] domainObjects; 
} 

解析与Unmarshaller.unmarshall文档()所有源的字段为空后,如果我替换它的内部标签属性,我可以得到它的标量字段:

<source> 
    <name>....</name> 
    <class>...</class> 
</source> 

我想避免这种冗余。

我终于通过使用'@XmlAttribute'注解打开标签或单个标签内的所有字段来解决我的问题。

我建议相应地明确注释字段为@XmlElement@XmlAttribute。然后你的班级将如下所示,并且字段将填充:

@XmlRootElement(name = "import-sources") 
public class ImportSources { 

    @XmlType 
    public static class DomainObject { 

     @XmlType 
     public static class Source { 

      @XmlType 
      public static class URI { 


       @XmlAttribute //here 
       private String value; 

       @XmlAttribute //here 
       private boolean secured; 
      } 

      @XmlType 
      public static class Key { 

       @XmlEnum 
       public enum Mode { 
        @XmlEnumValue("in_uri") 
        IN_URI, 
        @XmlEnumValue("in_header") 
        IN_HEADER 
       } 

       @XmlAttribute //here 
       private String name; 

       @XmlAttribute //here 
       private String value; 

       @XmlAttribute //here 
       private Mode mode; 
      } 


      @XmlAttribute //here 
      private String name; 

      @XmlElement //here 
      private URI uri; 

      @XmlElement //here 
      private Key key; 

      @XmlElement(name = "class") 
      private Class outputClass; 
     } 

     @XmlAttribute(name = "class") 
     private Class<? extends Entity> subjectClass; 

     @XmlElementWrapper 
     @XmlElement(name = "source") 
     private Source[] sources; 
    } 
}