В настоящее время я использую плагин Maven jaxb2 для создания POJO из моих XSD. У меня пока есть несколько проблем.
У меня есть 1 родительский XSD, который импортирует другой XSD, который, в свою очередь, импортирует 2 других XSD.
a.xsd -> b.xsd -> (c.xsd & d.xsd)
В моей конфигурации файла POM для плагина я включаю только самый верхний родительский XSD (a.xsd).
Два импортированных XSD имеют элементы с одинаковыми именами, поэтому изначально, когда я запускал плагин, я получил сообщение об ошибке:
Класс/интерфейс с таким же именем {class/interface} уже используется. Используйте настройку класса, чтобы разрешить этот конфликт.
После долгих поисков в Google и заливки StackOverflow я наткнулся на решение использовать пользовательский файл привязки для обработки переименования классов/элементов-нарушителей.
<jaxb:bindings xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxb = "http://java.sun.com/xml/ns/jaxb"
xsi:schemaLocation = "http://java.sun.com/xml/ns/jaxb" version = "2.0">
<jaxb:bindings schemaLocation = "./sets.xsd">
<jaxb:schemaBindings>
<jaxb:package name = "foo.set"/>
</jaxb:schemaBindings>
<jaxb:bindings node = "//xsd:complexType[@name='SomeType']">
<jaxb:class name = "SetsSomeType"/>
</jaxb:bindings>
<jaxb:bindings node = "//xsd:complexType[@name='InfoType']">
<jaxb:class name = "SetsInfoType"/>
</jaxb:bindings>
<jaxb:bindings node = "//xsd:complexType[@name='OpsType']">
<jaxb:class name = "SetsOpsType"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>xsd-to-java</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<packageName>some.package.name.bindings</packageName>
<sources>
<source>src/main/xsd/package/messages.xsd</source>
</sources>
<xjbSources>
<xjbSource>src/main/xsd/package/bindings.xjb</xjbSource>
</xjbSources>
<xjbExcludeFilters>
<filter implementation = "org.codehaus.mojo.jaxb2.shared.filters.pattern.PatternFileFilter">
<patterns>
<pattern>\.xsd</pattern>
</patterns>
</filter>
</xjbExcludeFilters>
<!--<arguments>
<argument>-XautoNameResolution</argument>
</arguments>-->
</configuration>
</plugin>
Это привело к следующей ошибке:
org.xml.sax.SAXParseException: не внешний файл привязки. Корневой элемент должен быть {https://jakarta.ee/xml/ns/jaxb}bindings, но это {http://java.sun.com/xml/ns/jaxb}bindings
Я не могу понять, почему он настаивает на «https://jakarta/ee/xml/ns/jaxb»!
Кроме того, я также попытался добавить -XautoNameResolution
в качестве аргумента в конфигурацию моего плагина и получил ту же ошибку.
Я также запускаю сборку с панели Maven в IntelliJ.
Есть идеи, что я мог упустить или неправильно настроить?
Проблема https://jakarta/ee/xml/ns/jaxb заключается в том, что jaxb переместился с javax.xml.bind
на jakarta.xml.bind
в Java 17 (также SpringBoot 3 и Spring 6), нарушая всевозможные вещи. То же самое с javax.validation -> jakarta.validation.
В любом случае, взгляните на этот ответ, чтобы узнать, как исправить
Спасибо за быстрый ответ! Это исправило мою проблему (после рефакторинга множества импортов по всему проекту ;-))