Как JAXB отображает имя класса на имя элемента XML? - PullRequest
3 голосов
/ 24 февраля 2011

Я использую JAXB (версия, включенная в JDK 6) для маршалинга объектов в XML.Следующий фрагмент кода дает неожиданные результаты:


    public class JAXBTest {
        @XmlRootElement
        public static class VIPPerson {}</p>

<pre><code>    public static void main(String[] args) throws JAXBException {
        StringWriter sw = new StringWriter();
        VIPPerson p = new VIPPerson();
        JAXB.marshal(p, sw);
        System.out.println(sw.toString());
    }
}

Выходные данные выше:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<vipPerson/>

Я ожидаю увидеть имя класса, сопоставленное с VIPPersonэлемент, а не vipPerson, основанный на разделе 8.12.1 в спецификации JAXB , в которой указано

имя класса: имя класса сопоставляется с именем XML с помощью капитализации с использованиемjava.beans.Introspector.decapitalize (имя класса).

JavaDoc для этого decapitalize метода говорит следующее:

Служебный метод, чтобы взять строку и преобразовать еек обычной заглавной букве имени переменной Java.Обычно это означает преобразование первого символа из верхнего регистра в нижний регистр, , но в (необычном) особом случае, когда имеется более одного символа, а первый и второй символы - в верхнем регистре, мы оставляем его в покое ,Таким образом, «FooBah» становится «fooBah», а «X» становится «x», но «URL» остается как «URL».

Реализация нарушает спецификацию или я что-то неправильно понимаю?

1 Ответ

6 голосов
/ 24 февраля 2011

Это вызвано ошибкой в эталонной реализации. Похоже, что это не будет исправлено из-за проблем совместимости, которые это может вызвать. Обходной путь должен явно указать имя с @XmlRootElement.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...