JAXB解组-缺少元素且元素顺序不正确
我正在尝试解封一个我以前封送的XML 在解组结果中,我缺少元素,并且得到的元素与输入XML的顺序不同。我创建了一个afterUnmarshal()侦听器,在那里可以看到元素,但在生成的Java对象中看不到 XSD的结构是这样的(例如,“扇出”节点可以包含另一组processSteps,因此可以进行深度嵌套(树)): 缺少步骤1、步骤2和步骤4B 我在这里有行程的toString()输出:JAXB解组-缺少元素且元素顺序不正确,jaxb,jaxb2,Jaxb,Jaxb2,我正在尝试解封一个我以前封送的XML 在解组结果中,我缺少元素,并且得到的元素与输入XML的顺序不同。我创建了一个afterUnmarshal()侦听器,在那里可以看到元素,但在生成的Java对象中看不到 XSD的结构是这样的(例如,“扇出”节点可以包含另一组processSteps,因此可以进行深度嵌套(树)): 缺少步骤1、步骤2和步骤4B 我在这里有行程的toString()输出: com.x.ItineraryType@fe39ebf[step=com.x.StepType@28cb15
com.x.ItineraryType@fe39ebf[step=com.x.StepType@28cb15bf[endpointRef=Step6.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step6, description=<null>], stepOrFanoutOrDecision={com.x.ItineraryType$Decision@2d00c385[option={com.x.ItineraryType$Decision$Option@d2467d8[step=com.x.StepType@511d9ca5[endpointRef=Step2a.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step 2A, description=<null>], stepOrFanoutOrDecision=<null>, name=op1],com.x.ItineraryType$Decision$Option@6f173e3d[step=com.x.StepType@5ef74fc5[endpointRef=Step2a.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step 2B, description=<null>], stepOrFanoutOrDecision=<null>, name=op2]}, name=Decision-nonameneeded, description=<null>],com.x.FanoutType@3e963f38[path={com.x.FanoutType$Path@7a1095a1[step=com.x.StepType@56cfbba2[endpointRef=Step4A.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step4A, description=<null>], stepOrFanoutOrDecision=<null>, name=<null>],com.x.FanoutType$Path@6027b534[step=com.x.StepType@4ee99a3d[endpointRef=Step5.EP, type=SERVICE, params=<null>, paramsRef=<null>, name=Step5, description=<null>], stepOrFanoutOrDecision=<null>, name=<null>]}, name=Fan1, description=<null>]}]
com.x。ItineraryType@fe39ebf[step=com.x。StepType@28cb15bf[endpointRef=Step6.EP,type=SERVICE,params=,paramsRef=,name=Step6,description=],stepOrFanoutOrDecision={com.x.investaryType$Decision@2d00c385[option={com.x.itineraytype$Decision$Option@d2467d8[step=com.x。StepType@511d9ca5[endpointRef=Step2a.EP,type=SERVICE,params=,paramsRef=,name=Step2a,description=],stepOrFanoutOrDecision=,name=op1],com.x.investaryType$Decision$Option@6f173e3d[step=com.x。StepType@5ef74fc5[endpointRef=Step2a.EP,type=SERVICE,params=,paramsRef=,name=step2b,description=],stepOrFanoutOrDecision=,name=op2]},name=Decision nonameneed,description=],com.x。FanoutType@3e963f38[path={com.x.FanoutType$Path@7a1095a1[step=com.x。StepType@56cfbba2[endpointRef=Step4A.EP,type=SERVICE,params=,paramsRef=,name=Step4A,description=],stepOrFanoutOrDecision=,name=],com.x.FanoutType$Path@6027b534[step=com.x。StepType@4ee99a3d[endpointRef=Step5.EP,type=SERVICE,params=,paramsRef=,name=Step5,description=],stepOrFanoutOrDecision=,name=]},name=Fan1,description=]
我使用的Ant脚本:带有扩展名hashCode、toString和equals:
<?xml version="1.0" encoding="UTF-8"?>
<project name="RunningXjc" default="generate-sources" basedir=".">
<description>Runs Xjc Binding Compiler</description>
<target name="generate-sources">
<taskdef name="xjc" classname="org.jvnet.jaxb2_commons.xjc.XJC2Task">
<classpath>
<fileset dir="buildLib/jaxb-ri-2.2.6/lib">
<include name="*" />
</fileset>
<fileset dir="buildLib/jaxb2-basics-dist-0.6.4/dist">
<include name="jaxb2-basics-ant-*.jar" />
</fileset>
</classpath>
</taskdef>
<!-- Generate the Java code for XSD -->
<xjc destdir="${basedir}/target/generated-sources/xjc" extension="true">
<arg
line="
-Xequals
-XhashCode
-XtoString
-Xcopyable
-Xmergeable" />
<binding dir="${basedir}/src">
<include name="**/*.xjb" />
</binding>
<schema dir="${basedir}/schema">
<include name="processSlim.xsd" />
</schema>
<!-- Plugins -->
<classpath>
<fileset dir="${basedir}/buildLib/jaxb2-basics-dist-0.6.4">
<!-- JAXB2 Basics library -->
<include name="dist/jaxb2-basics-*.jar" />
<!-- JAXB2 Basics library dependencies -->
<include name="dist/jaxb2-basics-runtime-*.jar" />
<include name="dist/jaxb2-basics-tools-*.jar" />
<include name="lib/commons-beanutils-*.jar" />
<include name="lib/commons-lang-*.jar" />
<include name="lib/commons-logging-*.jar" />
<include name="lib/javaparser-*.jar" />
<include name="lib/annox-*.jar" />
</fileset>
</classpath>
</xjc>
</target>
</project>
运行Xjc绑定编译器
问题
来自您的XML模式
下面是XML模式中的一个片段。行程类型
包含一个序列,其中步骤
元素可以出现在choice结构的内部和外部
行程类型
这会导致步骤
元素映射到两个不同的属性,从而导致出现问题
公共类行程类型{
@XmlElement(必需=true)
保护步进式步进;
@XmlElements({
@XmlElement(name=“step”,type=StepType.class),
@XmlElement(name=“fanout”,type=FanoutType.class),
@XmlElement(name=“decision”,type=itinerayType.decision.class)
})
受保护的列表步骤或扇出或决定;
...
}
解决方案 您可以使用JAXB XJC工具中的扩展来支持此用例。它将自动阻止创建
步骤
属性。您可以通过如下外部绑定文档指定此属性:
bindings.xml
XJC呼叫
下面是如何在XJC调用中引用外部绑定文件。您还需要使用-extension
标志来启用XJC扩展名
xjc -extension -b bindings.xml schema.xsd
问题 来自您的XML模式 下面是XML模式中的一个片段。
行程类型
包含一个序列,其中步骤
元素可以出现在choice结构的内部和外部
行程类型
这会导致步骤
元素映射到两个不同的属性,从而导致出现问题
公共类行程类型{
@XmlElement(必需=true)
保护步进式步进;
@XmlElements({
@XmlElement(name=“step”,type=StepType.class),
@XmlElement(name=“fanout”,type=FanoutType.class),
@XmlElement(name=“decision”,type=itinerayType.decision.class)
})
受保护的列表步骤或扇出或决定;
...
}
解决方案 您可以使用JAXB XJC工具中的扩展来支持此用例。它将自动阻止创建
步骤
属性。您可以通过如下外部绑定文档指定此属性:
bindings.xml
XJC呼叫
下面是如何在XJC调用中引用外部绑定文件。您还需要使用-extension
标志来启用XJC扩展名
xjc -extension -b bindings.xml schema.xsd
对应的JAXB对象是什么样子的?我添加了更多信息-我希望引起您的注意:),我在您的博客上读了一些条目,但找不到我要找的内容..您是从XML模式生成模型的吗?是的。我使用的ant脚本与此基本相同(不同版本的libs)如图所示:这可能与我正在使用的扩展有关吗?关于如何调试它,您有什么建议吗?(我对jaxb相当陌生)相应的jaxb对象看起来像什么?我添加了一个更多的信息-我是hop
<?xml version="1.0" encoding="UTF-8"?>
<project name="RunningXjc" default="generate-sources" basedir=".">
<description>Runs Xjc Binding Compiler</description>
<target name="generate-sources">
<taskdef name="xjc" classname="org.jvnet.jaxb2_commons.xjc.XJC2Task">
<classpath>
<fileset dir="buildLib/jaxb-ri-2.2.6/lib">
<include name="*" />
</fileset>
<fileset dir="buildLib/jaxb2-basics-dist-0.6.4/dist">
<include name="jaxb2-basics-ant-*.jar" />
</fileset>
</classpath>
</taskdef>
<!-- Generate the Java code for XSD -->
<xjc destdir="${basedir}/target/generated-sources/xjc" extension="true">
<arg
line="
-Xequals
-XhashCode
-XtoString
-Xcopyable
-Xmergeable" />
<binding dir="${basedir}/src">
<include name="**/*.xjb" />
</binding>
<schema dir="${basedir}/schema">
<include name="processSlim.xsd" />
</schema>
<!-- Plugins -->
<classpath>
<fileset dir="${basedir}/buildLib/jaxb2-basics-dist-0.6.4">
<!-- JAXB2 Basics library -->
<include name="dist/jaxb2-basics-*.jar" />
<!-- JAXB2 Basics library dependencies -->
<include name="dist/jaxb2-basics-runtime-*.jar" />
<include name="dist/jaxb2-basics-tools-*.jar" />
<include name="lib/commons-beanutils-*.jar" />
<include name="lib/commons-lang-*.jar" />
<include name="lib/commons-logging-*.jar" />
<include name="lib/javaparser-*.jar" />
<include name="lib/annox-*.jar" />
</fileset>
</classpath>
</xjc>
</target>
</project>
xjc -extension -b bindings.xml schema.xsd