Работаем с xml в java - кастомные аннотации

Итак, у меня был код, получающий JSON через REST-API и с помощью jaxb преобразующий его в java-объекты. И был другой код, который те же объекты засылал в другое REST-API уже с использованием Gson (пожалуйста не спрашивай, почему в одном проекте используются две разные технологии для решения одной и той же задачи :) ).

Проблемы начались когда поля_в_json сталиНазываться чутьБолее сложно-и-разнообразно. JAXB расставляет для полей и классов аннотации @XmlType и @XmlElement чтобы матчить такие названия при преобразованиях. Gson же использует для матчинга свою аннотацию @SerializedName. Получается что нужно добавить эту аннотацию в генерируемые бины.

Я был уверен, что существует готовое решение этой задачи, но потратил прилично времени прежде чем нашел его. Мой спаситель - jaxb2-basics-annotate плагин. Первое, что нужно сделать - добавить его в зависимости твоего wadl-client-plugin:

<dependency>
    <groupId>org.jvnet.jaxb2_commons</groupId>
    <artifactId>jaxb2-basics-annotate</artifactId>
    <version>1.0.1</version>
</dependency>

а в конфигурацию добавить ключик:

<configuration>
    <xjcArguments>
        <argument>-Xannotate</argument>
    </xjcArguments>
</configuration>

Теперь надо расширить описание нужного поля в xsd-схеме:

<xsd:complexType name="complexType">
    <xsd:sequence>
        <xsd:element name="field-with-dash" type="xsd:string">
            <xsd:annotation>
                <xsd:appinfo>
                    <annox:annotate target="field">
                        @com.google.gson.annotations.SerializedName("field-with-dash")
                    </annox:annotate>
                </xsd:appinfo>
            </xsd:annotation>
        </xsd:element>
        <xsd:element name="field_with_underscore" type="xsd:string">
            <xsd:annotation>
                <xsd:appinfo>
                    <annox:annotate target="field">
                        @com.google.gson.annotations.SerializedName("field_with_underscore")
                    </annox:annotate>
                </xsd:appinfo>
            </xsd:annotation>
        </xsd:element>
    </xsd:sequence>
</xsd:complexType>

Аналогичным образом можно аннотировать не только поля, но и методы классов (например, обозвать их @Deprecated :) ) и сами классы.

Проблема автоматически сгенерированного кода в том, что он автоматически сгенерирован. Он имеет жесткую структуру, ограниченную правилами генерации. С одной стороны, можно расширять механизмы генерации, повышая гибкость, с другой стороны, есть риск получить еще один язык программирования (а смысл тогда?). Истина как всегда где-то между.

comments powered by Disqus