2011-02-23 4 views
3

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


    public class JAXBTest { 
     @XmlRootElement 
     public static class VIPPerson {}

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 specification, в котором указывается

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

JavaDoc для этого decapitalize метода говорит это: метод Utility

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

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

ответ

6

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

+0

Хорошая информация – chris

Смежные вопросы