2016-11-29 11 views
0

Я искал способ легко изменить имя элемента списка объектов с помощью JAXB при публикации их через веб-службу. Вот пример:JAXB: простой способ аннотировать имя тегов элементов для списков объектов

Скажем, у меня есть объект, я хочу, чтобы сериализовать в XML:

@XmlRootElement(name = "greeting") 
public class TestClassForSo { 

    public String id; 
    public List<String> description; 
} 

И у меня есть веб-сервис, публикующий список этих объектов как XML:

@GET 
@Path("/so-test") 
@Produces({AgiMediaType.APPLICATION_XML, AgiMediaType.APPLICATION_JSON}) 
@XmlElementWrapper(name = "wrapperName") 
public List<TestClassForSo> getGreetings() { 

    List<TestClassForSo> greetingList = new ArrayList<>(); 

    TestClassForSo greeting = new TestClassForSo(); 

    String id = "hello-word"; 
    List<String> greetings = new ArrayList<>(Arrays.asList("Hello World, 
                  Bonjour le monde, 
                  Hallo Welt, 
                  Hola Mundo")); 

    greeting.id = id; 
    greeting.description = greetings; 

    greetingList.add(greeting); 

    return greetingList; 
} 

я получаю следующий результат, когда я запросить ресурс через HTTP GET вызов:

<testClassForSoes> 
    <greeting> 
     <id>hello-word</id> 
     <description>Hello World, Bonjour le monde, Hallo Welt, Hola Mundo</description> 
    </greeting> 
</testClassForSoes> 

есть ли е asy способ изменить имя элемента списка на greetings, кроме того, что он помещает его в метод оболочки или записывает собственный механизм сериализации и т. д.?

Очевидно, что я не могу изменить имя TestClassForSo из-за соглашений об именах.

В качестве побочного вопроса эта проблема действительно имела бы значение, чтобы сделать ее более читаемой для людей, что такое имя элемента списка?

Благодарим вас за вопрос. Любая помощь приветствуется. Я просматривал похожие вопросы в Интернете, но ничто, похоже, не соответствует моей проблеме.

Привет

ответ

1

Как already stated here:

Вы не можете этого добиться только с JAXB, так как аннотации должен быть положить на самом ArrayList класса.

Решение будет с использованием метода Джексона ObjectWriter «s: withRootName()


Однако, я думаю, что в значительной степени проще создать свой собственный класс-обертку для этого, так как Джерси не разрешить имя корневой настройки:

@XmlRootElement(name = "greetings") 
public class RootClass { 

    @XmlElement(name = "greeting") 
    public List<TestClassForSo> greetingList; 

} 

и изменить стратегию своего метода, к следующему, например:

@GET 
@Path("/so-test") 
@Produces({AgiMediaType.APPLICATION_XML, AgiMediaType.APPLICATION_JSON}) 
public RootClass getGreetings() { 
    List<TestClassForSo> greetingList = new ArrayList<>(); 

    for (int i = 0; i < 3; i++) { 
     TestClassForSo testClassForSo = new TestClassForSo(); 

     String id = "hello-word"; 
     List<String> greetings = new ArrayList<>(Arrays.asList("Hello World " + i)); 
     testClassForSo.id = id; 
     testClassForSo.description = greetings; 

     greetingList.add(testClassForSo); 
    } 

    RootClass r = new RootClass(); 
    r.greetingList = greetingList; 
    return r; 
} 

Тогда мы должны были бы окончательный результат:

<greetings> 
    <greeting> 
     <id>hello-word</id> 
     <description>Hello World 0</description> 
    </greeting> 
    <greeting> 
     <id>hello-word</id> 
     <description>Hello World 1</description> 
    </greeting> 
    <greeting> 
     <id>hello-word</id> 
     <description>Hello World 2</description> 
    </greeting> 
</greetings> 
+0

Здравствуйте, спасибо за ответ. Именно это я и сделал. Ссылка, которую вы поделили, была полезной для будущих начинающих JAXB. – Scyla101

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

  • Нет связанных вопросов^_^