Коллекции JAXB (Список <T>) Использовать Pascal Case вместо Camel Case для имен элементов - PullRequest
5 голосов
/ 09 октября 2009

У меня есть несколько бобов JAXB, которые непосредственно маршалируются и распаковываются с использованием Джерси.

* 1003 Е.Г. *

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Artifact", propOrder = {
    "artifactId",
    "artifactType",
    "contentHash"
})
@XmlSeeAlso({
    EmailArtifact.class,
    ManagedDocArtifact.class
})
@XmlRootElement(name ="Artifact")
public class Artifact {

    protected String artifactId;
    protected String artifactType;
    protected String contentHash;

...
...
...

}

Если я создаю метод GET, который возвращает один объект артефакта. Он правильно выдает XML:

<Artifact>
 <artifactId>293289392839283</artifactId>
 <artifactType>EMAIL</artifactType>
 <contentHash>2837873827322</contentHash>
</Artifact>

Здесь я смог успешно контролировать имя элемента Артефакта, чтобы в начале он имел заглавную букву "А".

Однако я создаю метод GET, который возвращает коллекцию артефактных объектов, и в итоге получаю:

<artifacts>
<Artifact>
 <artifactId>293289392839283</artifactId>
 <artifactType>EMAIL</artifactType>
 <contentHash>2837873827322</contentHash>
</Artifact>
<Artifact>
 <artifactId>293289392839283</artifactId>
 <artifactType>EMAIL</artifactType>
 <contentHash>2837873827322</contentHash>
</Artifact>
</artifacts>

Как видите, внешний элемент для коллекции имеет строчную букву "А". Чтобы соответствовать нашему собственному внутреннему стандарту, я бы хотел, чтобы это была заглавная буква «А» - Артефакты.

Я не могу понять, где это можно определить в JAXB, действительно ли это контролируется инфраструктурой Джерси?

Можем ли мы контролировать имя элемента, сгенерированное для коллекций?

Большое спасибо,

Джеймс

Ответы [ 2 ]

9 голосов
/ 10 октября 2009

Попробуйте использовать @ XmlElementWrapper , который поддерживает атрибут name:

@XmlElementWrapper(name="ELEMENTS")
@XmlElement(name="ELEMENT")
protected final List<String> elements = new LinkedList<String>();

Будет производить

<ELEMENTS>
  <ELEMENT>one</ELEMENT>
  <ELEMENT>two</ELEMENT>
  ...
</ELEMENTS>

См. Учебник JAXB для этой функции.

5 голосов
/ 13 октября 2009

ОК - у меня есть обновление от лидера сообщества Java-Джерси - Пола Сандоса. В настоящее время это открытая проблема с платформой Jersey, и нам нужно будет обойти ее или принять, пока она не будет исправлена ​​в будущем обновлении.

Обходной путь, как объяснено в одном из приведенных выше комментариев, заключается во введении нового класса для каждого метода веб-службы, который возвращает коллекцию (например, список) аннотированных компонентов JAXB. Этот класс фактически является классом, который содержит только один член - список bean-компонентов JAXB. Вместо того чтобы возвращать List в методе веб-сервиса, мы возвращаем специальный класс. Потому что у нас есть контроль над именем нового класса в XML, например, @XmlRootElement (name = "Артефакты"), мы можем обойти проблему в краткосрочной перспективе.

Надеюсь, это поможет.

С уважением,

Джеймс

...