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?
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.
<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.
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.
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>
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
}
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>
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