Работаем с 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