【问题标题】:JAXB not mapping an attribute into a "custom" classJAXB 未将属性映射到“自定义”类
【发布时间】:2014-10-02 18:59:56
【问题描述】:

我正在从 xml 模式生成 java 类,对于一种复杂类型,我希望 jaxb 使用现有类,为此我有一个外部绑定自定义文件。 对于该类型的单个属性,自定义类被正确解组为 except,该属性永远不会填充到 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文件的sn-p是:

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]

使用只有 nameAttr 和 nameEl 的 getter 和 setter 的自定义 Thing 类,输出是

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;
    }
}

谁能解释为什么“nameEL”元素和“nameAttr”属性的行为不同?

将自定义 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>

【问题讨论】:

    标签: java jaxb


    【解决方案1】:

    嗯,您实际上应该在属性中获得null,而不是在元素中。

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

    但是,如前所述,您实际上应该为属性而不是元素获取null。可以请您重新检查一下吗?

    这是 Blaise 的 relevant post

    【讨论】:

    • 这是我得到 null 的属性。没错,将注释添加到自定义类中就可以了。
    • 我误解了 xsd->java 类生成映射的性质:我认为在 .xjb 中定义映射的目的是避免编辑 xsd 或目标自定义 java 类,两者都不应该需要知道另一个,即。良好的解耦。出于兴趣,是否有另一种机制来实现到自定义类的映射?这会是适配器吗? PS - 感谢您不厌其烦地回答我原来的问题。
    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多