在JAXB中对生成的xml强制xsi:type属性

时间:2015-09-28 10:39:07

标签: java xml xslt jaxb xml-serialization

我需要在字段上强制xsi:type生成,因为xml将通过xsl转换表反序列化为不同的对象。数据类型是使用XSD架构定义的,任何人都可以使用jaxb生成类并将数据发送到端点,但端点是完全动态的,并使用包含公共数据字段的特殊DTO和一些将保存动态数据字段的Object映射。

例如,这就是我得到的:

<?xml version="1.0" encoding="UTF-8"?>
<myp:documento xmlns:myp="mypns" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <myp:sys_name>name</myp:sys_name>
  <myp:sys_path>path</myp:sys_path>
  <myp:sys_type>type</myp:sys_type>
  <myp:dyn_date_modified>2015-09-30T11:13:10.810+02:00</myp:dyn_date_modified>
</myp:documento>

这就是我需要的:

<?xml version="1.0" encoding="UTF-8"?>
<myp:documento xmlns:myp="mypns" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <myp:sys_name>name</myp:sys_name>
  <myp:sys_path>path</myp:sys_path>
  <myp:sys_type>type</myp:sys_type>
  <myp:dyn_date_modified xsi:type="xs:dateTime">2015-09-30T11:13:10.810+02:00</myp:dyn_date_modified>
</myp:documento>

因为属性dyn_date_modified将被反序列化为动态对象图..

如果您需要更多详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

经过另一天的研究似乎JAXB不提供此功能,因为它应该使用始终相同的对象来编组和解组xml。在我的情况下,我需要通过XSD从xjc生成的类中编组xml,然后使用带注释的DTO进行解组,该DTO包含许多固定字段和三个动态字段映射(以def_,dyn_和mul_开头)。我通过添加一个xsl预处理阶段解决了我的要求,该阶段将前缀字段映射到地图,并根据名称前缀附加xsi:type。

<myp:documento xmlns:myp="mypns" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <myp:sys_uuid>2ca56a7e9ca62dcd2d2ad8eeca100fd24</myp:sys_uuid>
  <myp:sys_name>2127a09acda7bf6acf26257bb80372f90</myp:sys_name>
  <myp:dyn_date_modified>2015-09-30T11:13:10.810+02:00</myp:dyn_date_modified>
</myp:documento>

转换为:

<myp:documento xmlns:myp="mypns" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <myp:sys_uuid>uuid</myp:sys_uuid>
  <myp:sys_name>name</myp:sys_name>
  <myp:dynFields>
    <entry>
        <key>dyn_date_modified</key>
        <value xsi:type="xs:dateTime">2015-09-30T11:13:10.810+02:00</value>
    </entry>
  </myp:dynFields>
</myp:documento>

然后正确地解组。