Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JAXB中对生成的xml强制使用xsi:type属性_Java_Xml_Xslt_Jaxb_Xml Serialization - Fatal编程技术网

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

Java 在JAXB中对生成的xml强制使用xsi:type属性,java,xml,xslt,jaxb,xml-serialization,Java,Xml,Xslt,Jaxb,Xml Serialization,我需要在字段上强制生成xsi:type,因为xml将通过xsl转换表反序列化到不同的对象中。数据类型是用XSD模式定义的,任何人都可以使用jaxb生成类并将数据发送到端点,但端点是完全动态的,并且使用一个特殊的DTO,其中包含公共数据字段和一些将保存动态数据字段的对象映射 例如,我得到的是: <?xml version="1.0" encoding="UTF-8"?> <myp:documento xmlns:myp="mypns" xmlns:xs="http://www.w

我需要在字段上强制生成xsi:type,因为xml将通过xsl转换表反序列化到不同的对象中。数据类型是用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>

名称
路径
类型
2015-09-30T11:13:10.810+02:00
这就是我需要的:

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

名称
路径
类型
2015-09-30T11:13:10.810+02:00
因为属性
dyn\u date\u modified
将反序列化到动态对象映射中


如果您需要更多详细信息,请告诉我。

经过一天的研究后,JAXB似乎没有提供此功能,因为它应该始终使用相同的对象封送和解封送xml。在我的例子中,我需要从xjc通过XSD生成的类中封送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>

2CA56A7E9CA62DCD2AD8EECA100FD24
2127a09acda7bf6acf26257bb80372f90
2015-09-30T11:13:10.810+02:00
转换为:

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

uuid
名称
修改日期
2015-09-30T11:13:10.810+02:00

然后正确地解组。

为什么需要
xs:string
,我无法理解:基本上所有XML都是尽可能多的字符串。--但无论如何,您都无法从JAXB获得此信息。这是必需的,因为反序列化对象包含对象映射,因此如果类型为xs:dateTime,它将知道如何进行反序列化。。无论如何,我通过对收到的xml应用XSL预处理“解决”了这个问题,因为使用jaxb似乎不可能像您所说的那样。由于xs:string不清楚,我将使用其他类型更新我的问题。。