Czy istnieje sposób radzenia sobie z duplikatami definicji elementów w wielu.pliki xsd w JAXB?

Mam dziesiątki i dziesiątki .xsd plików, dla których chcę automatycznie wygenerować kod. Kilka plików ma zduplikowane nazwy, które zderzają się, gdy próbuję wygenerować je wszystkie w tym samym czasie.

Skupiam się tylko na próbach, aby dwa z nich zadziałały.

Kiedy te 2 będą działać, naprawię resztę. Ale na razie skupiam się na dwóch tych plikach. Nie mam nad nimi kontroli, są od sprzedawcy i postępują zgodnie z "standardem" , więc edycja nie jest to opcja z wielu powodów.

Używam maven-jaxb2-plugin do przetwarzania tych plików.

Dodałem plik binding.xjb zgodnie z sugestią w linku w odpowiedzi mat b i innych instrukcjach, które znalazłem w sieci. Ale dostaję następujące błędy, brak wyjścia.

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings version="2.1"
              xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
              xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
              xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xsi:schemaLocation=" http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd">
  <jxb:bindings schemaLocation="mac-3.4.xsd">
    <jxb:schemaBindings>
      <jxb:package name="my.company.mac"/>
    </jxb:schemaBindings>
  </jxb:bindings>
  <jxb:bindings schemaLocation="mac-stylesheet-3.4.xsd">
    <jxb:schemaBindings>
      <jxb:package name="my.company.stylesheet"/>
    </jxb:schemaBindings>
  </jxb:bindings>
</jxb:bindings>

Daje następujący błąd

[ERROR] Error while parsing schema(s).Location [ file:/C:/Users/Jarrod%20Roberson/Projects/spa-tools/spa-lib/src/main/sc
hema/mac-stylesheet-3.4.xsd{165,33}].
org.xml.sax.SAXParseException: 'halign' is already defined

Element obrażający to: (jest wiele innych to jest tylko pierwszy, który się zderza)

<xsd:simpleType name="halign">
  <xsd:restriction base="xsd:string">
    <xsd:enumeration value="left" />
    <xsd:enumeration value="center" />
    <xsd:enumeration value="right" />
  </xsd:restriction>
</xsd:simpleType>

I jest identyczna w każdym z .xsd files, jak rozwiązać ten problem, gdy generowana jest tylko jedna klasa lub każda z nich jest generowana w ich własnej przestrzeni nazw pakietów?

To nie jest jedyny duplikat takiego elementu, jest ich wiele, więc po prostu próba usunięcia ich z plików też nie wchodzi w grę.

Ten halign znajduje się w wielu plikach .xsd i chcę albo umieścić je w poszczególnych pakietach, albo móc powiedzieć kompilatorowi, aby użył pierwszego, który został wygenerowany.

Tutaj zacząłem, zanim wypróbowałem zewnętrzny plik .xjb, po prostu podając package W pom.xml.

Jak skonfigurować powiązanie tak, aby ignorowało zduplikowane konfiguracje, mapowało je do oddzielnych pakietów lub mapowało do istniejących implementacji?

Author: mrcrabs, 2011-07-13

5 answers

Mam w połowie rozwiązanie obejścia tego problemu, ale jest to bardzo czasochłonne. Musiałem utworzyć osobną <execution/> dla każdego pliku, który ma zduplikowane wpisy.

<executions>
  <execution>
    <id>jaxb-mac</id>
    <phase>generate-sources</phase>
    <goals>
      <goal>generate</goal>
    </goals>
    <configuration>
      <forceRegenerate>true</forceRegenerate>
      <generatePackage>my.company.mac</generatePackage>
      <schemaDirectory>src/main/schema</schemaDirectory>
      <schemaIncludes>
        <include>mac-3.4.xsd</include>
      </schemaIncludes>
    </configuration>
  </execution>
  <execution>
    <id>jaxb-stylesheet</id>
    <phase>generate-sources</phase>
    <goals>
      <goal>generate</goal>
    </goals>
    <configuration>
      <forceRegenerate>true</forceRegenerate>
      <generatePackage>my.company.stylesheet</generatePackage>
      <schemaDirectory>src/main/schema</schemaDirectory>
      <schemaIncludes>
        <include>mac-stylesheet-3.4.xsd</include>
      </schemaIncludes>
    </configuration>
  </execution>

<forceRegenerate>true</forceRegenerate> jest ważne lub tylko pierwszy <execution/> uruchomi się, a reszta pomyśli, że nie ma potrzeby uruchamiania, ponieważ generuję do tego samego katalogu.

Nadal chciałbym mniej pracochłonne rozwiązanie do radzenia sobie z duplikatami. Myślę, że jeśli zrobię pierwszego mistrza .xsd a oddzielny moduł, który wbudowuje się we własny .plik jar, mógłbym wtedy użyć znacznika <episode/> i pozwolić mu pominąć generowanie tych samych duplikatów elementów w kółko, ponieważ są one identyczne w definicji.

od tego czasu zdecydowałem się porzucić XML, jeśli to w ogóle możliwe i JAXB całkowicie. Istnieją nowsze i lepsze sposoby analizowania XML i mapowania go do obiektów od tej edycji.

 11
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-02 21:38:40

Uświadom sobie, że to stare, ale miałem ten sam błąd i mogłem go rozwiązać przez nie podając docelowego pakietu , tzn. opcję-b z xjc. Następnie zduplikowane elementy są tworzone w pakiecie z własną przestrzenią nazw i bez konfliktów.

 5
Author: mrcrabs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-15 11:12:07

Dodaj <schemaBindings> element do XSD:

<schemaBindings>
    <package name="com.whatever.stuff" />
</schemaBindings>

Źródło

 1
Author: matt b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-13 15:21:09

Zamieszczam moje rozwiązanie dla gradle , rozwiązuje duplikat problemu i nie wymaga plików xjb:

task generateJaxb() {
    ext.sourcesDir = "${buildDir}/generated-sources/jaxb"
    ext.classesDir = "${buildDir}/classes/jaxb"
    ext.schemaDir = "src/resources/schemas"
    ext.tmp = "${buildDir}/tmp/xjc"

    doLast() {
        project.ant {
            taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask",
                    classpath: configurations.jaxb.asPath

            delete(dir: tmp)
            mkdir(dir: tmp)
            delete(dir: sourcesDir)
            delete(dir: classesDir)
            mkdir(dir: sourcesDir)
            mkdir(dir: classesDir)
        }

        fileTree(schemaDir){
            include '**/*.xsd'
            include '**/*.wsdl'
        }.each{File file->
            //println file
            project.ant {
                taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask",
                        classpath: configurations.jaxb.asPath
                xjc(destdir: tmp, schema:"${file.getAbsolutePath()}") {
                    arg(value: "-wsdl")
                    produces(dir: tmp, includes: "**/*.java")
                }
                copy(todir: sourcesDir) {
                    fileset(dir: tmp, erroronmissingdir: false) {
                        include(name: "**/*.java")
                    }
                }
                delete(dir: tmp)
                mkdir(dir: tmp)
            }
        }
        project.ant {
            javac(destdir: classesDir, source: 1.6, target: 1.6, debug: true,
                    debugLevel: "lines,vars,source",
                    classpath: configurations.jaxb.asPath) {
                src(path: sourcesDir)
                include(name: "**/*.java")
                include(name: "*.java")
            }

            copy(todir: classesDir) {
                fileset(dir: sourcesDir, erroronmissingdir: false) {
                    exclude(name: "**/*.java")
                }
            }
        }
    }
}

configurations {
    jaxb
}

dependencies {
    jaxb("com.sun.xml.bind:jaxb-xjc:2.2.4-1")
    compile(files(generateJaxb.classesDir).builtBy(generateJaxb))
}

jar {
    from generateJaxb.classesDir
}
 1
Author: pgregory,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-27 19:06:01

Mieliśmy podobny problem: mieliśmy jeden plik wsdl i dwa pliki xsd w tym samym katalogu. Plik wsdl importuje dwa pliki xsd. Problem polegał na tym, że JAXB brał pod uwagę wszystkie trzy pliki i rzucał"... jest już zdefiniowany błąd. W zasadzie narzekał, że widział ten sam element zarówno w pliku wsdl, jak i xsd.

Możemy rozwiązać ten problem w konfiguracji wtyczki maven (w pom.xml) poprzez dodanie znacznika exclude jak w poniższym przykładzie:

    <build>
    <plugins>
        <plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <version>0.12.3</version>
            <executions>
                <execution>
                    <goals>
                        <goal>generate</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <schemaLanguage>WSDL</schemaLanguage>
                <generatePackage>mywsdl.wsdl</generatePackage>
                <args><arg>-XautoNameResolution</arg></args>
                <schemas>
                    <schema>
                        <fileset>
                            <excludes>
                                <exclude>*.xsd</exclude>
                            </excludes>
                        </fileset>
                    </schema>
                </schemas>
            </configuration>
        </plugin>
    </plugins>
</build>
 1
Author: caytekin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-19 14:25:33