Решите проблему JAXB "столкновение имен в классе ObjectFactory" с настройкой - PullRequest
9 голосов
/ 16 сентября 2011

Выполнение команды "xjc" на этих файлах xsd возвращает Two declarations cause a collision in the ObjectFactory class, поскольку есть 2 элемента с именами "Scale" и "scale".

Согласно thispage , эта проблема может быть решена путем настройки файлов xsd с помощью <factoryMethod>.

Ты знаешь, как это сделать?У вас есть пример файла привязки для этого?

Ответы [ 4 ]

11 голосов
/ 16 сентября 2011

Вы можете использовать тег привязок. Установите атрибут schemaLocation для местоположения определенного xsd. Затем дочерние теги, schemaBindings и package определяют новое пространство имен пакета для этого xsd. Ниже приведен файл привязок, который я использовал с xjc некоторое время назад. Если это все еще работает, отлично. Если нет, то пример =).

<?xml version="1.0" ?>
<bindings xmlns="http://java.sun.com/xml/ns/jaxb" version="2.1"
      xmlns:kml="http://www.opengis.net/kml/2.2"
      xmlns:atom="http://www.w3.org/2005/Atom">

  <bindings schemaLocation="ogckml22.xsd">
    <schemaBindings>
      <package name="net.opengis.kml"/>
    </schemaBindings>
  </bindings>
  <bindings schemaLocation="kml22gx.xsd">
    <schemaBindings>
      <package name="net.opengis.kml.ex"/>
    </schemaBindings>
  </bindings>
  <bindings schemaLocation="atom-author-link.xsd">
    <schemaBindings>
      <package name="org.w3c.atom"/>
    </schemaBindings>
  </bindings>
  <bindings schemaLocation="xAL.xsd">
    <schemaBindings>
      <package name="org.oasis.xal"/>
    </schemaBindings>
  </bindings>
  <bindings scd="kml:scale">
    <class name="scaleliteral"/>
  </bindings>
  <bindings scd="kml:snippet">
    <class name="snippetliteral"/>
  </bindings>
  <bindings scd="kml:Snippet">
    <property name="snippetDeprecated"/>
  </bindings>
  <bindings scd="atom:link">
    <property name="atomLink"/>
  </bindings>
</bindings>
5 голосов
/ 16 сентября 2011

Вы пробовали -B-XautoNameResolution?Это может не всегда сработать, но лучше всего попробовать, прежде чем писать файл привязки.

3 голосов
/ 16 сентября 2011

Одним из решений вашей проблемы является использование опции -p для указания отдельных имен пакетов для каждого файла xsd.

0 голосов
/ 30 января 2018

Ну, после долгой попытки у меня сработала следующая конфигурация. Я использую jaxb2-maven-plugin 2.3.1 и отдельный файл привязки:

pom.xml

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>2.3.1</version>
            <executions>
                <execution>
                    <id>xjc</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <target>2.1</target>
                <sources>
                    <source>src/main/xsd</source>
                </sources>
                <xjbSources>
                    <xjbSource>src/main/xjb/bindings-1.3.xjb</xjbSource>
                </xjbSources>
                <arguments>
                    <argument>-Xfluent-api</argument>
                </arguments>
                <!-- Package name of the generated sources. -->
                <!-- Don't use it, because we've already declared separate package name inside bindings -->
                <!-- <packageName>com.abc.xyz.generated</packageName> -->
                <outputDirectory>${basedir}/target/generated-sources/classes</outputDirectory>
                <clearOutputDir>false</clearOutputDir>
                <extension>true</extension>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.jvnet.jaxb2_commons</groupId>
                    <artifactId>jaxb2-fluent-api</artifactId>
                    <version>3.0</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

bindings.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<jxb:bindings schemaLocation="../xsd/ccv1p3_imscp_v1p2_v1p0.xsd"
    node="//xs:schema">
    <jxb:globalBindings>
        <jxb:serializable uid="1" />
        <jxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"
            parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
            printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
    </jxb:globalBindings>
    <jxb:schemaBindings>
        <jxb:package name="com.abc.xyz.generated.manifest" />
    </jxb:schemaBindings>
</jxb:bindings>

<jxb:bindings
    schemaLocation="http://www.imsglobal.org/profile/cc/ccv1p3/LOM/ccv1p3_lommanifest_v1p0.xsd"
    node="//xs:schema">
    <jxb:schemaBindings>
        <jxb:package name="com.abc.xyz.generated.lommanifest" />
    </jxb:schemaBindings>
</jxb:bindings>

<jxb:bindings
    schemaLocation="http://www.imsglobal.org/profile/cc/ccv1p3/LOM/ccv1p3_lomresource_v1p0.xsd"
    node="//xs:schema">
    <jxb:schemaBindings>
        <jxb:package name="com.lcs.thincc.generated.lomresource" />
    </jxb:schemaBindings>
</jxb:bindings>

Обратите внимание, что нам не нужно указывать packageName внутри pom.xml, вместо этого мы можем объявить его, используя <jxb:schemaBindings> внутри bindings.xjb , что намного проще, как упоминалось здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...