当前位置: 首页 > 面试题库 >

如何指定JAXB用于封送/拆封数据的适配器?

尉迟默
2023-03-14
问题内容

有没有一种方法可以指定JAXB在XML模式中用于编组/解编对象的适配器?

例如,如果我想将以下内容解析为整数:

<SpecialValue>0x1234</SpecialValue>

我可以在架构中使用以下内容:

<xs:simpleType name="HexInt">
    <xs:annotation> 
        <xs:appinfo>
            <jaxb:javaType name="int" parseMethod="Integer.decode" />
        </xs:appinfo>
    </xs:annotation>  
    <xs:restriction base="xs:string">
        <xs:pattern value="0x[0-9a-fA-F]+" />
    </xs:restriction>
</xs:simpleType>
<xs:element name="SpecialValue" type="HexInt" />

当我通过XJC工具运行模式时,应使用Integer.decode()作为值为0x1234的Integer或十进制4660来解码字符串“
0x1234”。生成的Adapter类正确反映了这一点:

public Integer unmarshal(String value) {
    return (Integer.decode(value));
}

但是,当我想将值编组回XML元素(这是String文字)时,Adapter类执行以下操作:

public String marshal(Integer value) {
    if (value == null) {
        return null;
    }
    return value.toString();
}

在这种情况下,整数0x1234(十进制的4660)的String值为“ 4660”,它不符合我的架构(因为它没有“ 0x”前缀)。

如何告诉适配器我希望将整数0x1234编组为“
0x1234”字符串文字?我希望能够在模式中执行此操作,这样我就可以生成新的Java类,而不必修改输出。这可能吗?

编辑: 基于已接受的答案,这是我所做的工作:

我在com.example.Parse类中编写了一个名为toHexString()的方法:

public static String toHexString(int value)
{
    return ("0x" + Integer.toHexString(value));
}

然后,我将架构指向该打印方法:

<xs:simpleType name="HexInt">
    <xs:annotation> 
        <xs:appinfo>
            <jaxb:javaType name="int" parseMethod="Integer.decode" printMethod="com.example.Parse.toHexString" />
        </xs:appinfo>
    </xs:annotation>  
    <xs:restriction base="xs:string">
        <xs:pattern value="0x[0-9a-fA-F]+" />
    </xs:restriction>
</xs:simpleType>

问题答案:

试试这个

<jaxb:javaType name="int" parseMethod="Integer.decode" 
                          printMethod="Integer.toHexString"/>

我还没有测试过,但是我记得使用了非常相似的东西。



 类似资料:
  • 我正在尝试使用JAXB进行封送处理。 我的输出是这样的: ...但我需要这样的输出: 如果取消对代码的注释,则会得到。没有它,我可以编译,但我不能得到所需的精确输出。 我的豆子长这样: 适配器类

  • 我正在构建一系列链接类,我希望这些类的实例能够整理成XML,这样我就可以将它们保存到一个文件中,以后再读进去。 目前我使用以下代码作为测试用例: XML输出为: 元素为空有什么原因吗?我希望它包含日期的字符串表示(即)。为了做到这一点,我需要编写一些我自己的代码吗? 的输出是:

  • 问题内容: 我试图编组多个对象,例如添加到via中。我开始使用此设置: 和 但是,我得到了以下运行时例外: javax.xml.bind.JAXBException:com.jaxb.example.marshall.Book或其任何超类对此上下文都是未知的] 我的类型定义如下。 书:- 图书清单:- 马歇尔代码:- 我正在尝试放置注释(参考:-JAXB异常:该上下文未知的类)。该注释在我的版本中

  • 我正在尝试封送和取消封送映射到值对/从值对。我可以成功封送该对象,但是,我不能从XML中取消封送它。反封送结果是映射中存在的关键字,但其值为空。 下面是我要封送和取消封送的模型: 而且我还发现了一个关于这个问题的类似问题“JAXB:如何将映射编入 value ”,然而,它并没有解决解编组问题?

  • 我有一个关于通过JAXB封送的小问题。 当前我有一个对象的HashMap 由自定义HashMapAdapter封送的being 封送基于以下文章:http://blog.bdoughan.com/2013/06/moxys-xmlvariableNode-using-maps-key-as.html HashMap由布尔值、长值或字符串值填充。 因此,关于Blog,预期的JSON输出应该是: 西蒙

  • 问题内容: 我有几种复杂的数据结构,例如 注意:就我而言,使用Set或List并不重要。 现在我知道JAXB让我定义了 XmlAdapter ,这很好,但是我不想为每个给定的数据结构都定义一个XmlAdapter(这将是太多的复制和粘贴代码)。 我试图通过声明两个泛化的XmlAdapters来实现我的目标: 一个用于地图: 一套 问题 : JAXB抱怨如下: 这是我的适配器类: 这是我的JUnit