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

JAXB未将类型添加到@XMLJavaTypeAdapter注释

蔚桐
2023-03-14

我得到了一个XSD,其中包含一个xs:integer字段。我希望生成的代码使用int,这样我就可以对其应用现有接口。(该字段是必填字段,并且永远不会超过32位范围,它应该是xs:int)。

使用XJB,我可以更改生成代码中的类型。但是在创建JAXBContext时,这给了我一个错误。

<bindings
        xmlns="http://java.sun.com/xml/ns/jaxb"
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">
  <bindings schemaLocation="mySchema.xsd">
    <bindings node="//xsd:element[@name='myField']">

      <!-- either with jaxb -->
      <property name="myField">
        <baseType name="int">
          <javaType name="int" />
        </baseType>
      </property>

      <!-- or with xjc-->
      <xjc:javaType name="int"/>

    </bindings>
  </bindings>
</bindings>

这将生成以下代码

public class MyClass {
    @XmlElement(required = true, type = String.class)
    @XmlJavaTypeAdapter(value = Adapter1.class)
    @XmlSchemaType(name = "integer")
    protected int myField;

    // ...
}

虽然这适用于代码生成,但它在编组时失败,并在创建上下文时引发以下异常。

Adapter myPackage.Adapter1.class is not applicable to the field type int. 
    this problem is related to the following location:
        at @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(type=javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter$DEFAULT.class, value=mySchemaPackage.Adapter1.class)

如果我手动向注释添加一个type参数,问题就解决了,但是我找不到让JAXB为我做这件事的方法。

@XmlJavaTypeAdapter(value = Adapter1.class, type = int.class)

共有1个答案

程树
2023-03-14

使用JAXB2基本插件,我成功地覆盖了生成的注释。我决定使用命名适配器,而不是动态生成的Adapter1。类,但IntAdapter的实现是相同的XmlAdapter

<bindings
        xmlns="http://java.sun.com/xml/ns/jaxb"
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        xmlns:annox="http://annox.dev.java.net">
  <bindings schemaLocation="mySchema.xsd">
    <bindings node="//xsd:element[@name='myField']">

      <annox:annotate target="field">
        @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(value=myCodePackage.IntAdapter.class, type=int.class)
      </annox:annotate>
      <xjc:javaType name="int" adapter="myCodePackage.IntAdapter"/>

    </bindings>
  </bindings>
</bindings>

现在代码生成如下

@XmlElement(required = true, type = String.class)
@XmlJavaTypeAdapter(value = IntAdapter.class, type = int.class)
@XmlSchemaType(name = "integer")
protected int myField;

 类似资料:
  • 问题内容: 嗨,stackoverflow世界, 我想在XSD中指定JAXB可以将特定元素用作XmlRootElement。 我知道如何将注释添加到生成的类中:我想做的是指定可以在代码生成之前将元素生成为根元素。 我使用外部JAXB定制(.xjb文件)。目的是不修改架构(因为它们正在定义标准)。 有人知道怎么做吗?谢谢! 新泽西 问题答案: 问题解决了。 JAXB插件Annotate http:/

  • 问题内容: 如果需要在列表中添加枚举属性,如何声明列表?让我们说枚举类是: 我想要做: 需要用什么代替 问题答案: 如果要使用字符串类型,请使用以下命令: 否则,MByD的答案

  • 问题内容: 我遇到了一些以前在Java中从未遇到过的事情,也就是说,我需要在运行时创建一个新的ArrayList类实例,而无需分配已知类型,然后将数据添加到列表中。听起来有点含糊,所以这里有个例子: 现在,我之所以这样做而不是仅仅使用泛型,是因为泛型已经被大量使用,并且本例中的“ i”变量将被用作类型“?”。我真的不希望再使用其他泛型,因为这会给用户带来更多工作,并且在最终设计中灵活性会大大降低。

  • 我正在使用带有钩子的React 16.8.3,目前我想键入 对于我的当前代码,的类型是,而我希望它的类型是。也存在同样的问题。 如何将类型符号添加到?

  • 我一直在使用 annox 在我的 jaxb 生成的类上添加注释(通过绑定文件),但我找不到直接在包上添加注释的方法(包信息.java)。 我一直在尝试在bindings.xml中这样做: 但是jaxb抱怨说< code>annox:annotate不应该在那里。 还有别的方法吗?

  • 我想在java中创建一个哈希表类,将键和值对存储在链表的ArrayList中 然后,我想创建一个链接列表对象,然后可以使用该对象在arrayList的每个索引内创建一个新的链接列表。为此,我声明: 然后我设置了add函数以将元素添加到LinkedList的第一个索引中,该索引位于arrayList的哈希键索引中: 每次运行此代码时,我都会收到一个错误,其中我的索引为7而我的大小为0。这会导致错误: