Изменить Java-классы, чтобы включить конкретные аннотации во время компиляции
У меня есть много классов, сгенерированных JAXB xsd2java. Мне нужно, чтобы все эти классы были аннотированы конкретными аннотациями во время компиляции (например, аннотациями lombok). Есть ли способ сделать это, например, с помощью какого-либо инструмента генерации кода?
1 ответ
Отказ от ответственности: я являюсь автором плагина аннотаций JAXB2, который позволяет добавлять произвольные аннотации к классам, производным от схемы.
Краткий пример:
<xsd:complexType name="FooType">
<xsd:annotation>
<xsd:appinfo>
<annox:annotate>@java.lang.SuppressWarnings({"unchecked","rawtypes"})</annox:annotate>
<annox:annotate target="package">@javax.annotation.Generated({"XJC","JAXB2 Annotate Plugin"})</annox:annotate>
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
<xsd:element name="bar" type="xsd:string"/>
<xsd:element name="foobar" type="xsd:string">
<xsd:annotation>
<xsd:appinfo>
<annox:annotate>@java.lang.SuppressWarnings({"unchecked","rawtypes"})</annox:annotate>
<annox:annotate target="setter">@java.lang.Deprecated</annox:annotate>
<annox:annotate target="setter-parameter">@java.lang.Deprecated</annox:annotate>
<annox:annotate target="getter">@java.lang.Deprecated</annox:annotate>
<annox:annotate target="field">@java.lang.Deprecated</annox:annotate>
<annox:annotate target="class">@java.lang.Deprecated</annox:annotate>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
Работает и во внешних файлах привязки.
Ограничения:
- Аннотации предоставляются в синтаксисе Java, но вы должны использовать полностью определенные имена.
- Вы должны включить классы аннотаций (например, lombok) в путь классов XJC, так как эти классы должны быть доступны во время компиляции схемы.
пс. Я предполагаю, что когда вы сказали xsd2java
Вы, вероятно, имели в виду XJC.
Обновить
ОП спрашивал в комментариях, как настроить его с помощью плагина jaxb2-maven-plugin.
Ты можешь использовать jaxb2-annotate-plugin
с помощью /questions/tagged/jaxb2-maven-plugin. Я просто никогда не пробовал это.
- Вы можете включить дополнительные JAR-файлы в classpath, используя
dependencies/depenency
вpom.xml
, - Тогда вам нужно будет добавить
arguments
в конфигурации.
Смотрите этот ответ (и вопрос) для примеров:
Речь идет о других плагинах, но вы получите представление о том, как настроить его с помощью Codehaus /questions/tagged/jaxb2-maven-plugin.
Конфигурация с моим плагином maven-jaxb2 будет выглядеть следующим образом:
<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>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-annotate-plugin-test-annox-annotations</artifactId>
</plugin>
</plugins>
</configuration>
</plugin>
Эта часть:
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-annotate-plugin-test-annox-annotations</artifactId>
</plugin>
относится к артефакту, содержащему классы аннотаций.
Вот образец pom.xml
для /questions/tagged/maven-jaxb2-plugin / /questions/tagged/jaxb2-annotate-plugin.