JAXB没有将属性映射到“自定义”类

时间:2014-10-02 18:59:57

标签: java jaxb

我从xml架构生成java类,对于一个复杂类型,我希望jaxb使用现有的类,我有一个外部绑定自定义文件。 对于类型的单个属性,自定义类被正式解组为之外的其他属性,该属性永远不会填充在java类中。

下面是类型/类Thing问题的演示。

架构中定义的东西是:

<xsd:complexType name="Thing">
  <xsd:sequence>
    <xsd:element name="nameEl" type="xsd:string"/>
  </xsd:sequence>
  <xsd:attribute name="nameAttr" type="xsd:string" use="required"/>
</xsd:complexType>

和读取匹配的xml文件的代码段是:

JAXBContext jc = JAXBContext.newInstance("jaxbtest");
Unmarshaller u = jc.createUnmarshaller();

// Make it validate against the instance schema
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new File("./sample.xsd"));
u.setSchema(schema);

Config config = (Config)u.unmarshal(new File("./sample.xml"));

for (Thing thing : config.getThing()) {
  System.out.println("nameAttr=[" + thing.getNameAttr() +"]");
  System.out.println("nameEl=[" + thing.getNameEl() +"]");
}

阅读这个xml:

<m:config xmlns:m="test">
  <thing nameAttr="hello">
    <nameEl>goodbye</nameEl>
  </thing>
</m:config>

使用JAXB生成的Thing类(不使用自定义xjb),输出符合预期:

nameAttr=[hello]
nameEl=[goodbye]

使用自定义Thing类,它只有getter&amp; nameAttr&amp;的setters nameEl,输出

nameAttr=[null]
nameEl=[goodbye]

自定义类只是:

public class Thing {
    private String nameEl;
    private String nameAttr;

    public String getNameEl() {
        return nameEl;
    }
    public void setNameEl(String value) {
        this.nameEl = value;
    }

    public String getNameAttr() {
        return nameAttr;
    }
    public void setNameAttr(String value) {
        this.nameAttr = value;
    }
}

任何人都可以解释为什么&#34; nameEL&#34;元素和&#34; nameAttr&#34;属性&#34; ?

将自定义Thing与生成的JAXB进行比较Thing唯一的区别是注释,我认为在不从Java类生成模式时这是必要的,并且显然不包含所包含的元素。

为完整起见,xjb为:

<jxb:bindings
    version="2.1"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb">

  <jxb:bindings schemaLocation="sample.xsd">

    <jxb:bindings node="//xsd:complexType[@name='Thing']">
      <jxb:package name=""/>
      <jxb:class ref="custom.Thing"/>
    </jxb:bindings>

  </jxb:bindings>
</jxb:bindings>

1 个答案:

答案 0 :(得分:0)

嗯,你应该在属性中获得null,而不是在元素中。

我的猜测是问题很简单。注释很重要:如果您不提供它们,那么您的属性将被视为@XmlElement - 默认情况下注释。这就是为什么一个属性是未编组的,另一个属性不是。

但是,如上所述,您实际上应该为属性获取null,而不是元素。你能复习一下吗?

这是Blaise的relevant post