1

私の会社のプロジェクトでは、非常に単純なビジネス プロセス エンジンの構築に取り組んでいます。そのために、私は BPMN の研究から始めました。現在、XPDL の詳細に取り組んでいます。http://www.xpdl.org/から XPDL xsd をダウンロードし、xjc とそのラッピング Eclipse プラグインを使用して、この xsd からクラスを生成しようとしました。次のようなエラーが競合するため失敗します

parsing a schema...
[ERROR] Property "TimeDate" is already defined. Use <jaxb:property> to resolve this conflict.
  line 3558 of file:/home/alberto/Job/WSP/orch/orch.model/src/main/resources/bpmnxpdl_40a.xsd

正直なところ、私は知りません 1) なぜそのような公式で標準的な xsd にこのような問題があるのか​​ 2) どうすれば解決できるのでしょうか?

4

1 に答える 1

0

問題

要素をチェックアウトするTriggerTimeと、 という要素と属性があることがわかりますTimeDate。これは XML では問題になりませんが、デフォルトでは、JAXB 実装はこれらの項目の両方を同じ Java プロパティにマップしようとするため、競合が発生します。

<xsd:element name="TriggerTimer">
    <xsd:annotation>
        <xsd:documentation>BPMN: If the Trigger Type is Timer then this must be present</xsd:documentation>
    </xsd:annotation>
    <xsd:complexType>
        <xsd:sequence>
            <xsd:choice>
                <xsd:element name="TimeDate" type="xpdl:ExpressionType"/>
                <xsd:element name="TimeCycle" type="xpdl:ExpressionType"/>
            </xsd:choice>
            <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <xsd:attribute name="TimeDate" type="xsd:string" use="optional">
            <xsd:annotation>
                <xsd:documentation>Deprecated</xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="TimeCycle" type="xsd:string" use="optional">
            <xsd:annotation>
                <xsd:documentation>Deprecated</xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
        <xsd:anyAttribute namespace="##other" processContents="lax"/>
    </xsd:complexType>
</xsd:element>

ソリューション (binding.xml)

外部バインディング ファイルを使用して、JAXB 実装が XML スキーマからモデル化された Java を生成する方法をカスタマイズできます。以下は、生成されたプロパティの 1 つの名前を変更する例です。

<jxb:bindings
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">

    <jxb:bindings schemaLocation="bpmnxpdl_40a.xsd">
        <jxb:bindings node="//xsd:element[@name='TriggerTimer']/xsd:complexType/xsd:attribute[@name='TimeDate']">
            <jxb:property name="timeDateAttr"/>
        </jxb:bindings>
    </jxb:bindings>

</jxb:bindings>

XJCコール

この-bオプションは、XJC ユーティリティを使用するときにバインディング ファイルを指定するために使用されます。

xjc -b binding.xml bpmnxpdl_40a.xsd
于 2012-09-16T19:03:27.410 に答える