Hyperjaxb3: ошибка во время генерации классов с поддержкой JAXB и JPA из файлов xsd и xjb - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь сгенерировать классы JAXB, которые совместимы с JPA, используя Hyperjaxb3. У меня есть следующие схемы xsd и xjb, я адаптировал их для использования Hyperjaxb3 в соответствии с (https://github.com/highsource/hyperjaxb3/wiki/Enforcing_top-level_classes), используя шаблон проекта Maven hyperjaxb3-ejb-template-basic-0.6.2.

XSD-фрагмент (я не смог перечислить полную схему из-за ограничений stackoverflow):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns="http://schemas.compassplus.com/sdk/1.0/iso_definition.xsd" targetNamespace="http://schemas.compassplus.com/sdk/1.0/iso_definition.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="1.0">
    <xs:element name="definition">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="ns:types" />
                <xs:element ref="ns:fields" />
                <xs:choice>
                    <xs:element ref="ns:messages" />
                    <xs:element ref="ns:templates" />
                </xs:choice>
            </xs:sequence>
            <xs:attribute name="name" use="required" type="xs:string" />
            <xs:attribute name="version" use="optional" default="1.0"/>
        </xs:complexType>
        <xs:key name="type">
            <xs:selector xpath="./ns:types/ns:*"/>
            <xs:field xpath="@name"/>
        </xs:key>
        <xs:keyref name="type_ref" refer="ns:type">

            <xs:selector xpath="./ns:fields/ns:custom|
                                ./ns:fields/ns:array/ns:custom|
                                ./ns:fields/ns:condition/ns:*/ns:custom|
                                ./ns:fields/ns:condition/ns:*/ns:array/ns:custom|
                                ./ns:fields/ns:header/ns:custom|
                                ./ns:fields/ns:header/ns:array/ns:custom|
                                ./ns:fields/ns:header/ns:condition/ns:*/ns:custom|
                                ./ns:fields/ns:header/ns:condition/ns:*/ns:array/ns:custom|
                                ./ns:types/ns:struct/ns:custom|
                                ./ns:types/ns:struct/ns:array/ns:custom|
                                ./ns:types/ns:struct/ns:condition/ns:*/ns:custom|
                                ./ns:types/ns:struct/ns:condition/ns:*/ns:array/ns:custom|
                                ./ns:types/ns:composite/ns:custom|
                                ./ns:types/ns:composite/ns:array/ns:custom|
                                ./ns:types/ns:composite/ns:condition/ns:*/ns:custom|
                                ./ns:types/ns:composite/ns:condition/ns:*/ns:array/ns:custom|
                                ./ns:types/ns:composite/ns:header/ns:custom|
                                ./ns:types/ns:composite/ns:header/ns:array/ns:custom|
                                ./ns:types/ns:composite/ns:header/ns:condition/ns:*/ns:custom|
                                ./ns:types/ns:composite/ns:header/ns:condition/ns:*/ns:array/ns:custom" />
        <xs:field xpath="@type" />
    </xs:keyref>
</xs:element>

<!-- sections -->
<xs:element name="types">
    <xs:complexType>
        <xs:group ref="ns:types" minOccurs="0" maxOccurs="unbounded" />
    </xs:complexType>
</xs:element>
<xs:element name="fields">
    <xs:complexType>
        <xs:complexContent>
            <xs:extension base="ns:body" />
        </xs:complexContent>
    </xs:complexType>
    <xs:unique name="message_field">
        <xs:selector xpath="./ns:*|./ns:header/ns:*|./ns:condition/ns:*/ns:*|./ns:header/ns:condition/ns:*/ns:*"/>
        <xs:field xpath="@name"/>
    </xs:unique>
    <xs:unique name="message_index">
        <xs:selector xpath="./ns:*"/>
        <xs:field xpath="@index"/>
    </xs:unique>
</xs:element>
<xs:element name="messages">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="class" type="ns:rule" />
            <xs:element name="id" type="ns:rule" />
            <xs:element name="message" maxOccurs="unbounded" type="ns:requestDefinition" />
        </xs:sequence>
    </xs:complexType>
    <xs:unique name="messages">
        <xs:selector xpath="./ns:message/ns:response|./ns:message"/>
        <xs:field xpath="@name"/>
    </xs:unique>
</xs:element>

XJB:

<j:bindings schemaLocation="iso-definition.xsd" node="/xs:schema">
    <j:schemaBindings>
        <j:package name="com.cplus.sdk.iso.definition" />
        <j:nameXmlTransform>
            <j:typeName suffix="_ST" />
            <j:elementName suffix="_SE" />
            <j:modelGroupName suffix="_SG" />
            <j:anonymousTypeName suffix="_SM" />
        </j:nameXmlTransform>
    </j:schemaBindings>
    <j:bindings node="xs:element[@name='definition']">
        <j:class name="ProtocolDefinition" />
        <j:bindings node="xs:complexType/xs:sequence">
            <j:bindings node="xs:element[@ref='ns:types']">
                <j:property name="Types" />
            </j:bindings>
            <j:bindings node="xs:element[@ref='ns:fields']">
                <j:property name="Fields" />
            </j:bindings>
            <j:bindings node="xs:choice/xs:element[@ref='ns:messages']">
                <j:property name="Messages" />
            </j:bindings>
            <j:bindings node="xs:choice/xs:element[@ref='ns:templates']">
                <j:property name="Templates" />
            </j:bindings>
        </j:bindings>
    </j:bindings>

    <!-- DATA -->
    <j:bindings node="xs:complexType[@name='header']">
        <j:class name="ContentHeader" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:sequence/xs:group">
                <j:property name="FieldList" />
            </j:bindings>
            <j:bindings node="xs:sequence/xs:element[@name='mac']">
                <j:property name="FieldAuthentication" />
            </j:bindings>
            <j:bindings node="xs:sequence/xs:element[@name='bitmap']">
                <j:property name="FieldBitmap" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='struct']">
        <j:class name="ContentStruct" />
        <j:bindings node="xs:sequence/xs:group">
            <j:property name="FieldList" />
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='body']">
        <j:class name="Content" />
        <j:bindings node="xs:sequence/xs:choice">
            <j:property name="FieldList" />
            <j:bindings node="xs:element[@name='condition']/xs:complexType">
                <j:class name="FieldCondition" />
            </j:bindings>
        </j:bindings>
    </j:bindings>

    <!-- CONDITIONS -->
    <j:bindings node="xs:complexType[@name='condition']">
        <j:class name="Condition" />
        <j:bindings node="xs:group">
            <j:property name="Field" />
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='conditionString']">
        <j:class name="ConditionString" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='conditionLong']">
        <j:class name="ConditionLong" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='conditionCustom']">
        <j:class name="ConditionCustom" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='conditionDefault']">
        <j:class name="ConditionDefault" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='conditionAttribute']">
        <j:class name="ConditionAttribute" />
    </j:bindings>

    <j:bindings node="xs:group[@name='conditionFields']/xs:choice">
        <j:bindings node="xs:element[@name='long']">
            <j:class ref="com.cplus.sdk.iso.definition.ContentStruct.FieldLong" />
        </j:bindings>
        <j:bindings node="xs:element[@name='integer']">
            <j:class ref="com.cplus.sdk.iso.definition.ContentStruct.FieldInteger" />
        </j:bindings>
        <j:bindings node="xs:element[@name='decimal']">
            <j:class ref="com.cplus.sdk.iso.definition.ContentStruct.FieldDecimal" />
        </j:bindings>
        <j:bindings node="xs:element[@name='date']">
            <j:class ref="com.cplus.sdk.iso.definition.ContentStruct.FieldDate" />
        </j:bindings>
        <j:bindings node="xs:element[@name='string']">
            <j:class ref="com.cplus.sdk.iso.definition.ContentStruct.FieldString" />
        </j:bindings>
        <j:bindings node="xs:element[@name='binary']">
            <j:class ref="com.cplus.sdk.iso.definition.ContentStruct.FieldBinary" />
        </j:bindings>
        <j:bindings node="xs:element[@name='custom']">
            <j:class ref="com.cplus.sdk.iso.definition.ContentStruct.FieldCustom" />
        </j:bindings>
        <j:bindings node="xs:element[@name='array']">
            <j:class ref="com.cplus.sdk.iso.definition.ContentStruct.FieldArray" />
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:group[@name='indexFields']/xs:choice">
        <j:bindings node="xs:element[@name='long']/xs:complexType">
            <j:class name="FieldLong" />
        </j:bindings>
        <j:bindings node="xs:element[@name='integer']/xs:complexType">
            <j:class name="FieldInteger" />
        </j:bindings>
        <j:bindings node="xs:element[@name='decimal']/xs:complexType">
            <j:class name="FieldDecimal" />
        </j:bindings>
        <j:bindings node="xs:element[@name='date']/xs:complexType">
            <j:class name="FieldDate" />
        </j:bindings>
        <j:bindings node="xs:element[@name='string']/xs:complexType">
            <j:class name="FieldString" />
        </j:bindings>
        <j:bindings node="xs:element[@name='binary']/xs:complexType">
            <j:class name="FieldBinary" />
        </j:bindings>
        <j:bindings node="xs:element[@name='custom']/xs:complexType">
            <j:class name="FieldCustom" />
        </j:bindings>
        <j:bindings node="xs:element[@name='array']/xs:complexType">
            <j:class name="FieldArray" />
        </j:bindings>
        <j:bindings node="xs:element[@name='const']/xs:complexType">
            <j:class name="FieldConst" />
        </j:bindings>
    </j:bindings>

    <j:bindings node="xs:group[@name='structFields']/xs:choice">
        <j:bindings node="xs:element[@name='long']/xs:complexType">
            <j:class name="FieldLong" />
        </j:bindings>
        <j:bindings node="xs:element[@name='integer']/xs:complexType">
            <j:class name="FieldInteger" />
        </j:bindings>
        <j:bindings node="xs:element[@name='decimal']/xs:complexType">
            <j:class name="FieldDecimal" />
        </j:bindings>
        <j:bindings node="xs:element[@name='date']/xs:complexType">
            <j:class name="FieldDate" />
        </j:bindings>
        <j:bindings node="xs:element[@name='string']/xs:complexType">
            <j:class name="FieldString" />
        </j:bindings>
        <j:bindings node="xs:element[@name='binary']/xs:complexType">
            <j:class name="FieldBinary" />
        </j:bindings>
        <j:bindings node="xs:element[@name='custom']/xs:complexType">
            <j:class name="FieldCustom" />
        </j:bindings>
        <j:bindings node="xs:element[@name='array']/xs:complexType">
            <j:class name="FieldArray" />
        </j:bindings>
    </j:bindings>

    <!-- MESSAGES -->
    <j:bindings node="xs:complexType[@name='requestDefinition']">
        <j:class name="MessageRequest" />
        <j:bindings node="xs:sequence">
            <j:bindings node="xs:sequence/xs:element[@name='response']">
                <j:property name="ResponseList" />
            </j:bindings>
            <j:bindings node="xs:group">
                <j:property name="RuleList" />
            </j:bindings>
        </j:bindings>
        <j:bindings node="xs:attribute[@name='mac']">
            <j:property name="AuthenticationRequired" />
        </j:bindings>
        <j:bindings node="xs:attribute[@name='validate']">
            <j:property name="ValidationRequired" />
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='responseDefinition']">
        <j:class name="MessageResponse" />
        <j:bindings node="xs:sequence">
            <j:bindings node="xs:group">
                <j:property name="RuleList" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='repeatDefinition']">
        <j:class name="MessageRepeat" />
        <j:bindings node="xs:sequence">
            <j:bindings node="xs:group">
                <j:property name="RuleList" />
            </j:bindings>
        </j:bindings>
    </j:bindings>

    <!-- TEMPLATES -->
    <j:bindings node="xs:complexType[@name='template']">
        <j:class name="Template" />
        <j:bindings node="xs:attribute[@name='authentify']">
            <j:property name="AuthenticationRequired" />
        </j:bindings>
        <j:bindings node="xs:attribute[@name='validate']">
            <j:property name="ValidationRequired" />
        </j:bindings>
        <j:bindings node="xs:attribute[@name='key']">
            <j:property name="Key" />
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='request']">
        <j:class name="TemplateRequest" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:group">
                <j:property name="RuleList" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='notification']">
        <j:class name="TemplateNotification" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:group">
                <j:property name="RuleList" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='response']">
        <j:class name="TemplateResponse" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:group">
                <j:property name="RuleList" />
            </j:bindings>
            <j:bindings node="xs:attribute[@name='parent']">
                <j:class ref="Template" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='repeat']">
        <j:class name="TemplateRepeat" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:group">
                <j:property name="RuleList" />
            </j:bindings>
            <j:bindings node="xs:attribute[@name='parent']">
                <j:class ref="Template" />
            </j:bindings>
        </j:bindings>
    </j:bindings>

    <!-- SECTIONS -->
    <j:bindings node="xs:element[@name='types']/xs:complexType">
        <j:class name="DefinitionTypes" />
        <j:bindings node="xs:group">
            <j:property name="TypeList" />
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:element[@name='fields']/xs:complexType">
        <j:class name="DefinitionFields" />
    </j:bindings>
    <j:bindings node="xs:element[@name='messages']/xs:complexType">
        <j:class name="DefinitionMessages" />
        <j:bindings node="xs:sequence">
            <j:bindings node="xs:element[@name='id']">
                <j:property name="RuleKey" />
            </j:bindings>
            <j:bindings node="xs:element[@name='class']">
                <j:property name="RuleClass" />
            </j:bindings>
            <j:bindings node="xs:element[@name='message']">
                <j:property name="MessageList" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:element[@name='templates']/xs:complexType">
        <j:class name="DefinitionTemplates" />
        <j:bindings node="xs:attribute[@name='key']">
            <j:property name="FieldKey" />
        </j:bindings>
        <j:bindings node="xs:attribute[@name='class']">
            <j:property name="FieldClass" />
        </j:bindings>
        <j:bindings node="xs:sequence/xs:element[@name='template']">
            <j:property name="TemplateList" />
        </j:bindings>
    </j:bindings>

    <!-- TYPES -->
    <j:bindings node="xs:complexType[@name='structType']">
        <j:class name="TypeStruct" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='javaType']">
        <j:class name="TypeExternal" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='compositeType']">
        <j:class name="TypeComposite" />
    </j:bindings>

    <!-- ITEMS -->
    <j:bindings node="xs:complexType[@name='fieldMask']">
        <j:class name="ElementMask" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='fieldContainer']">
        <j:class name="ElementContainer" />
    </j:bindings>

    <!-- FIELDS -->
    <j:bindings node="xs:complexType[@name='field']">
        <j:class name="Field" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='binaryField']">
        <j:class name="FieldBinary" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:sequence/xs:element[@name='constraint']">
                <j:property name="ConstraintList" />
                <j:bindings node="xs:complexType">
                    <j:class name="Constraint" />
                </j:bindings>
            </j:bindings>
            <j:bindings node="xs:attribute[@name='var']">
                <j:property name="Variable" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='stringField']">
        <j:class name="FieldString" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:sequence/xs:element[@name='constraint']">
                <j:property name="ConstraintList" />
                <j:bindings node="xs:complexType">
                    <j:class name="Constraint" />
                </j:bindings>
            </j:bindings>
            <j:bindings node="xs:attribute[@name='var']">
                <j:property name="Variable" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='dateField']">
        <j:class name="FieldDate" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:attribute[@name='zone']">
                <j:property>
                    <j:baseType>
                        <xjc:javaType name="org.joda.time.DateTimeZone" adapter="com.cplus.sdk.iso.adapter.TimeZoneAdapter" />
                    </j:baseType>
                </j:property>
            </j:bindings>
            <j:bindings node="xs:attribute[@name='format']">
                <j:property>
                    <j:baseType>
                        <xjc:javaType name="org.joda.time.format.DateTimeFormatter" adapter="com.cplus.sdk.iso.adapter.DateTimeFormatAdapter" />
                    </j:baseType>
                </j:property>
            </j:bindings>
            <j:bindings node="xs:attribute[@name='var']">
                <j:property name="Variable" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='integerField']">
        <j:class name="FieldInteger" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:sequence/xs:element[@name='constraint']">
                <j:property name="ConstraintList" />
                <j:bindings node="xs:complexType">
                    <j:class name="Constraint" />
                </j:bindings>
            </j:bindings>
            <j:bindings node="xs:attribute[@name='var']">
                <j:property name="Variable" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='longField']">
        <j:class name="FieldLong" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:sequence/xs:element[@name='constraint']">
                <j:property name="ConstraintList" />
                <j:bindings node="xs:complexType">
                    <j:class name="Constraint" />
                </j:bindings>
            </j:bindings>
            <j:bindings node="xs:attribute[@name='var']">
                <j:property name="Variable" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='decimalField']">
        <j:class name="FieldDecimal" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:sequence/xs:element[@name='constraint']">
                <j:property name="ConstraintList" />
                <j:bindings node="xs:complexType">
                    <j:class name="Constraint" />
                </j:bindings>
            </j:bindings>
            <j:bindings node="xs:attribute[@name='var']">
                <j:property name="Variable" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='customField'] ">
        <j:class name="FieldCustom" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:sequence/xs:element[@name='parameter']">
                <j:property name="ParameterList" />
                <j:bindings node="xs:complexType">
                    <j:class name="Parameter" />
                </j:bindings>
            </j:bindings>
            <j:bindings node="xs:attribute[@name='var']">
                <j:property name="Variable" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='arrayField']">
        <j:class name="FieldArray" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:sequence">
                <j:bindings node="xs:element[@name='constraint']">
                    <j:property name="ConstraintList" />
                    <j:bindings node="xs:complexType">
                        <j:class name="Constraint" />
                    </j:bindings>
                </j:bindings>
                <j:bindings node="xs:group[@ref='ns:arrayFields']">
                    <j:property name="Field" />
                </j:bindings>
            </j:bindings>
            <j:bindings node="xs:attribute[@name='var']">
                <j:property name="Variable" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='conditionField']">
        <j:class name="FieldByCondition" />
        <j:bindings node="xs:complexContent/xs:extension">
            <j:bindings node="xs:group">
                <j:property name="ConditionList" />
            </j:bindings>
        </j:bindings>
    </j:bindings>
    <j:bindings node="xs:complexType[@name='constField']">
        <j:class name="FieldConst" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='specialField']">
        <j:class name="FieldSpecial" />
    </j:bindings>

    <!-- RULES -->
    <j:bindings node="xs:complexType[@name='rule']">
        <j:class name="Rule" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='dateRule']">
        <j:class name="RuleDate" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='integerRule']">
        <j:class name="RuleInteger" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='longRule']">
        <j:class name="RuleLong" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='decimalRule']">
        <j:class name="RuleDecimal" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='stringRule']">
        <j:class name="RuleString" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='binaryRule']">
        <j:class name="RuleBinary" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='fieldRule']">
        <j:class name="RuleField" />
    </j:bindings>
    <j:bindings node="xs:complexType[@name='echoRule']">
        <j:class name="RuleEcho" />
    </j:bindings>
</j:bindings>

Я получаю следующие сообщения об ошибках, которые очень похожи на друг с другом. Например:

[ERROR] Error while generating code.Location [ file:hyperjaxb3-ejb-template-basic 0.6.2/src/main/resources/bindings.xjb{385,54}].com.sun.istack.SAXParseException2: Two declarations cause a collision in the ObjectFactory class.

[ERROR] Error while generating code.Location [ file:hyperjaxb3-ejb-template-basic-0.6.2/src/main/resources/bindings.xjb{349,54}].com.sun.istack.SAXParseException2: (Related to above error) This is the other declaration.   

А также эта ошибка:

[ERROR] Error while generating code.Location [].org.xml.sax.SAXParseException: Error during plugin execution.

Когда речь идет о плагине xj c, с этими файлами все работает нормально. Я новичок в этом, поэтому я не знаю, что не так. Пожалуйста, помогите мне решить эту проблему!

...