当前位置: 首页 > 知识库问答 >
问题:

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

杭柏
2023-03-14

我从一个xml模式生成java类,对于一个复杂类型,我希望jaxb使用一个现有的类,我有一个外部绑定定制文件。自定义类被解组为正确的,除了该类型的单个属性,该属性从未在java类中填充。

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

模式中定义的内容是:

<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]

使用只有getters的自定义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”属性的行为不同吗?

将自定义的东西与JAXB生成的东西进行比较,唯一的区别是注释,我认为在不从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个答案

牛越
2023-03-14

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

我猜问题很简单。注释很重要:如果您不提供注释,那么默认情况下,您的属性将被视为带有注释的@xmlement。这就是为什么一个属性未签名,而另一个属性未签名的原因。

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

这是布莱斯的一篇相关文章。

 类似资料:
  • 我还在学习ReactJS。我正在挑战自己写一个非常基本的待办事项应用程序(就像一个人一样),我有一个问题,调用onhtml函数。 这里的问题是不能调用,因为它不在render函数的返回调用中 要从map函数内部访问handleClick,我需要做什么?

  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 我使用ModelMapper的方式如下: 我有几个转换器类是Spring组件,它们注册自定义ModelMapper映射 但是当Spring启动时,由于调用了configure函数,并且源代码为null,所以我得到了以下错误。 这怎么可能呢? 我用错了吗? bean是这样声明的,Foo和FooModel不是最终的 重要编辑 实际上,即使在主类内的函数中显式创建映射,也会得到相同的NullPointe

  • 试图向OpenLDAP添加一个新属性,但总是碰壁。我正在尝试向架构添加ipPhone属性,因为我不能在默认的telephoneNumber属性中包含*数字。 下面是我的LDIF文件,用于创建新属性并将其与objectClass类似。 我已经测试和谷歌了几个小时,但一直无法解决这个问题或找出我错过了什么!

  • 问题内容: 我是一个非常新的反应者,我正在尝试从Rails api导入数据,但出现错误 如果我使用react dev工具,则可以在控制台中看到状态,也可以看到联系人,方法是使用有人可以帮忙解决我做错的事情吗?我的组件看起来像这样: 问题答案: 无法读取未定义的属性“ map”,为什么? 因为最初是,并且of 将是 不确定的 。重要的一点是, componentDidMount 将在初始渲染后被调用

  • 我喜欢xml 我们有像Protocol1,Protocol2这样的课程。。etc派生自基类协议。喜欢 类数据可以具有协议列表或映射。对于映射键将像“原型1”和值将是原型1类的对象。 我试着做http://blog.bdoughan.com/2013/06/moxys-xmlvariablenode-using-maps-key-as.html但没有成功。如何使用变量节点和继承一起进行反编组。请引导