Изменить 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 в конфигурации.

Смотрите этот ответ (и вопрос) для примеров:

/questions/33461892/generatsiya-hashcode-i-equals-pri-sozdanii-klassov-java-s-ispolzovaniem-plagina-mojo-jaxb2-maven/33461909#33461909

Речь идет о других плагинах, но вы получите представление о том, как настроить его с помощью 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.

Другие вопросы по тегам