(Как) я могу заставить JAXB (MOXy) принимать не-геттеры для сортировки?

JAXB можно эффективно использовать для выгрузки структур в XML с помощью всего нескольких аннотаций. Поэзия JAXB заключается в том, что на самом деле не нужно создавать какие-то DTO или слишком сильно загромождать упорядоченный класс шаблонным кодом.

Но часто случается так, что метод, предоставляющий данные, не является геттером, а чем-то вроде formatDescription() или даже toString().

Это не имеет большого значения, если это всего лишь один класс, так как он может быть подклассом с добавлением getDescription(). Но с использованием функции MOXy для маршаллинга интерфейсов это становится сложнее - метод должен быть добавлен в интерфейс и изменены все реализации; или интерфейс подклассифицированный и все импли тоже.

// @XmlElement(name = "desc") // DOESN'T WORK.
String toDescription();

// JAXB needs getter :/
@XmlElement(name = "desc")
String getDescription();

Есть ли способ заставить MOXy принимать методы, не начинающиеся с get*?


person Ondra Žižka    schedule 06.06.2013    source источник


Ответы (1)


Я обнаружил, что MOXy позволяет использовать внешние метаданные в файлах XML (вместо аннотации). Также описано в Jaxb EclipseLink/MOXy: можно ли указать имена методов получения/установки.

Итак, в этом случае я бы установил

<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum8834871">
    <java-types>
        <java-type name="ServerInfo" xml-accessor-type="PUBLIC_MEMBER">
            <xml-root-element/>
            <java-attributes>
                <xml-element name="desc" java-attribute="description" >
                    <xml-access-methods get-method="toDescription"/>
                </xml-element>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

Не тестировалось, может не работать, если я пропущу set-method.

В любом случае, это всего лишь обходной путь, поэтому я заполнил запрос функции.

person Ondra Žižka    schedule 07.06.2013