在 JAXB 中对生成的 xml 强制 xsi:type 属性
Forcing xsi:type attribute on generated xml in JAXB
我需要在字段上强制生成 xsi:type,因为 xml 将通过 xsl 转换 sheet 反序列化为不同的对象。数据类型是用 XSD 模式定义的,任何人都可以使用 jaxb 生成 类 并将数据发送到端点,但端点是完全动态的,并使用包含公共数据字段和一些对象映射的特殊 DTO动态数据字段。
例如这是我得到的:
<?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
将被反序列化到动态对象映射中..
如果您需要更多详细信息,请告诉我。
经过另一天的研究,JAXB 似乎没有提供此功能,因为它应该始终使用相同的对象编组和解组 xml。在我的例子中,我需要从 xjc 通过 XSD 生成的 Class 编组 xml,然后使用带注释的 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>
然后正确解组。
我需要在字段上强制生成 xsi:type,因为 xml 将通过 xsl 转换 sheet 反序列化为不同的对象。数据类型是用 XSD 模式定义的,任何人都可以使用 jaxb 生成 类 并将数据发送到端点,但端点是完全动态的,并使用包含公共数据字段和一些对象映射的特殊 DTO动态数据字段。
例如这是我得到的:
<?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
将被反序列化到动态对象映射中..
如果您需要更多详细信息,请告诉我。
经过另一天的研究,JAXB 似乎没有提供此功能,因为它应该始终使用相同的对象编组和解组 xml。在我的例子中,我需要从 xjc 通过 XSD 生成的 Class 编组 xml,然后使用带注释的 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>
然后正确解组。