Ошибка в jaxb2-mavin-plugin XJB: пространство имен привязок элемента должно быть из пространства имен схемы

Я пытаюсь назначить разные пространства имен для разных файлов xsd и использовать плагин jaxb2-mavin для создания артефактов, определенных этими файлами xsd.

Maven не может сгенерировать источник со следующей ошибкой: The namespace of element 'bindings' must be from the schema namespace, 'http://www.w3.org/2001/XMLSchema'

Вот моя конфигурация:

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

<jaxb:bindings schemaLocation="xsd/TheRequest.xsd" node="/xsd:schema">
    <jaxb:schemaBindings>
        <jaxb:package name="com.package.request" />
    </jaxb:schemaBindings>
</jaxb:bindings>

<jaxb:bindings schemaLocation="xsd/TheResponse.xsd" node="/xsd:schema">
    <jaxb:schemaBindings>
        <jaxb:package name="com.package.response" />
    </jaxb:schemaBindings>
</jaxb:bindings>

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://company.services.com" 
xmlns:tns="http://company.services.com" 
elementFormDefault="unqualified">

<xsd:complexType name="FindSomething">
    <xsd:sequence>
        <xsd:element name="TestMode" type="xsd:string" maxOccurs="1" minOccurs="0"/>
        <xsd:element name="Channel" type="xsd:string" maxOccurs="1" minOccurs="1"/>
        <xsd:element name="UserId" type="xsd:string" maxOccurs="1" minOccurs="1"/>
        <xsd:element name="Role" type="xsd:string" maxOccurs="1" minOccurs="0"/>
        <xsd:element name="Format" type="xsd:string" maxOccurs="1" minOccurs="0"/>
        <xsd:element name="OrgId" type="xsd:string" maxOccurs="1" minOccurs="1"/>
        <xsd:element name="TransactionId" type="xsd:string" maxOccurs="1" minOccurs="1"/>
        <xsd:element name="Timeout" type="xsd:long" maxOccurs="1" minOccurs="0"/>
        <xsd:element name="RequestSegments" type="tns:RequestSegments" maxOccurs="1" minOccurs="0"/>
        <xsd:element name="VerifyUserType" type="xsd:string" maxOccurs="1" minOccurs="0"/>
        <xsd:element name="VerifyUserAccess" type="xsd:string" maxOccurs="1" minOccurs="0"/>
        <xsd:element name="IncludeFamily" type="xsd:string" minOccurs="0" maxOccurs="1"/>
        <xsd:element name="AsOfDate" type="xsd:string" maxOccurs="1" minOccurs="0"/>
        <xsd:element name="ActiveOnly" type="xsd:string" maxOccurs="1" minOccurs="0"/>
        <xsd:element name="SearchType" type="xsd:string" maxOccurs="1" minOccurs="0"/>
        <xsd:element name="SearchCriteria" type="tns:SearchCriteria" maxOccurs="1" minOccurs="0"/>
        <xsd:element name="AccessPrivileges" type="tns:AccessPrivileges" maxOccurs="1" minOccurs="0"/>
    </xsd:sequence>
</xsd:complexType></xsd:schema>

Я пробовал с различными формами директив пространства имен XML. В завершении кода Eclipse я могу видеть XML-схему привязок как вариант, поэтому я не знаю, почему maven возвращает эту ошибку.

1 ответ

Решение

Плагин maven jaxb2 находит ваш файл привязки по исходному пути и предполагает, что это xsd-файл. Вам придется исключить его, либо переместив, обновив исходные пути xsd / xjb, либо добавив фильтр исключения.

Самый простой вариант - обновить пути в конфигурации плагина:

<configuration>
    <sources>
        <!-- only xsd files under here -->
        <source>src/main/xjb/xsd</source>
    </sources>
    <xjbSources>
        <!-- specify binding file explicitly -->
        <xjbSource>src/main/xjb/bindings.xjb</xjbSource>
    </xjbSources>
</configuration>

Также есть проблема с вашим файлом привязки: вам нужно отобразить префикс пространства имен, который вы использовали в node приписывать. добавлять xmlns:xsd="http://www.w3.org/2001/XMLSchema" к корневому элементу.

Параметры конфигурации подробно описаны в документе для цели jaxb2:xjc.

Я столкнулся с тем же сообщением об ошибке и попробовал решение, предложенное @teppic, которое, к сожалению, не помогло.

Я обнаружил, что наличие файла привязки и файла XSD с одним и тем же именем вызывает одно и то же сообщение об ошибке! У меня было примерно так:

example.xjb и excle.xsd

После переименования файла.xjb в example-binding.xjb у меня все заработало!

Надеюсь, это поможет в 2020 году ^^

Другие вопросы по тегам