Управляйте JAXB для создания элементов IDREF вместо JaxBElement<?>
Я хочу генерировать классы, используя maven-jaxb2-plugin.
Мой ввод xsd выглядит следующим образом:
<complexType>
<complexContent>
<restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
<sequence>
<element name="ReferencedElementA" type="{http://www.w3.org/2001/XMLSchema}IDREFS" minOccurs="0" />
<element name="ReferencedElementB" type="{http://www.w3.org/2001/XMLSchema}IDREF"
maxOccurs="unbounded" minOccurs="0" />
</sequence>
</restriction>
</complexContent>
Обратите внимание, что я не могу изменить схему, так как она предоставлена внешним клиентом!
Это сгенерированный код:
@XmlList
@XmlElement(name = "ReferencedElementA")
@XmlIDREF
@XmlSchemaType(name = "IDREFS")
protected List<Object> referencedElementA;
@XmlElementRef(name = "ReferencedElementB", namespace = "ABC", type = JAXBElement.class, required = false)
protected List<JAXBElement<Object>> referencedElementB;
Как видите, "ReferencedElementB" генерируется в виде списка> с аннотацией @XMLElementRef.
Что я хочу, это что-то вроде следующего:
@XmlElement(name = "ReferencedElementB")
@XmlIDREF
@XmlSchemaType(name = "IDREF")
protected List<Object> referencedElementB;
Используя обходной путь от Blaise Doughan, я расширил свой файл привязки следующим кодом:
<bindings node = ".//xs:element[@name='ReferencedElementB']">
<class ref="java.lang.Object"/>
</bindings>
Это почти закончило работу, генерируя такой код:
@XmlElement(name = "ReferencedElementB")
@XmlSchemaType(name = "IDREF")
protected List<Object> referencedElementB;
Однако аннотация @XmlIDREF по-прежнему отсутствует. Это приводит к ошибкам при сортировке.
Я попытался добавить недостающую аннотацию через плагин annox:
<bindings node = ".//xs:element[@name='ReferencedElementB']">
<class ref="java.lang.Object"/>
<annox:annotate target="field">@javax.xml.bind.annotation.XmlIDREF</annox:annotate>
</bindings>
Но поколение терпит неудачу с
compiler was unable to honor this annox:annotate customization. It is attached to a wrong place, or its inconsistent with other bindings
Еще раз, я не могу изменить ввод XSD.
Заранее спасибо!
1 ответ
Обратите внимание, что я не могу изменить схему, так как она предоставлена внешним клиентом!
Я читаю это все время здесь на SO, и я всегда задаюсь вопросом - почему? Почему вы не можете изменить схему?
Ну, конечно, вы можете изменить схему до компиляции. Возьмите оригинальную схему и примените патч /XSLT/ что угодно, чтобы изменить его. Пока результат структурно соответствует исходной схеме, это нормально.
Рассмотрим ваш случай: вы используете приемы и обходные пути для эффективного взлома сгенерированного кода. Насколько лучше это по сравнению с изменением схемы перед компиляцией? Я не думаю, что это лучше. Это сложнее, подвержено ошибкам, и в конце вы не можете сказать, что ваш сгенерированный код является отражением вашей схемы. По сути, у вас нет схемы для вашего кода. Вы даже не можете сказать, является ли ваш взломанный сгенерированный код адекватным отражением исходной схемы.
Модифицировать схему до компиляции довольно просто. Вы можете легко сравнить оригинал с модифицированным и посмотреть, совместимы ли изменения или нет. Генерация проста, нет необходимости в взломах и обходных путях.
Теперь к вашему вопросу.
Привязка
<annox:annotate target="field">@javax.xml.bind.annotation.XmlIDREF</annox:annotate>
выглядит хорошо для меня. По какой-то причине это не учитывается при компиляции схемы, поэтому вы получаете ошибку.
Сложно сказать, почему это не считается. Я бы попробовал следующее:
Убедитесь, что вы действительно включаете / включаете плагин JAXB2 Basics Annotate в свою компиляцию:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <configuration> <extension>true</extension> <args> <arg>-Xannotate</arg> </args> <plugins> <plugin> <groupId>org.jvnet.jaxb2_commons</groupId> <artifactId>jaxb2-basics-annotate</artifactId> </plugin> </plugins> </configuration> </plugin>
Поместите элемент настройки в его собственный
bindings
элемент. Может быть, это не работает вместе сclass
по какой-то причине.
Я не вижу больше на данный момент должно работать.
Если это не поможет, пришлите мне пиар с минимальным воспроизводящим проектом здесь:
https://github.com/highsource/jaxb2-annotate-plugin-support
под я /idrefs. Я посмотрю.
Отказ от ответственности: я являюсь автором annox, /questions/tagged/jaxb2-annotate-plugin и /questions/tagged/maven-jaxb2-plugin.