JAXB解组-缺少元素且元素顺序不正确

JAXB解组-缺少元素且元素顺序不正确,jaxb,jaxb2,Jaxb,Jaxb2,我正在尝试解封一个我以前封送的XML 在解组结果中,我缺少元素,并且得到的元素与输入XML的顺序不同。我创建了一个afterUnmarshal()侦听器,在那里可以看到元素,但在生成的Java对象中看不到 XSD的结构是这样的(例如,“扇出”节点可以包含另一组processSteps,因此可以进行深度嵌套(树)): 缺少步骤1、步骤2和步骤4B 我在这里有行程的toString()输出: com.x.ItineraryType@fe39ebf[step=com.x.StepType@28cb15

我正在尝试解封一个我以前封送的XML

在解组结果中,我缺少元素,并且得到的元素与输入XML的顺序不同。我创建了一个afterUnmarshal()侦听器,在那里可以看到元素,但在生成的Java对象中看不到

XSD的结构是这样的(例如,“扇出”节点可以包含另一组processSteps,因此可以进行深度嵌套(树)):

缺少步骤1、步骤2和步骤4B

我在这里有行程的toString()输出:

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