2009-10-09 4 views
5

Mam wiele fasoli JAXB, które są bezpośrednio rozmieszczane i odfiltrowywane za pomocą sieci Jersey.Kolekcje JAXB (lista <T>) Użyj przypadku Pascala zamiast wielbłądzich dla nazw elementów

E.g.

@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; 

... 
... 
... 

} 

Jeśli utworzę metodę GET, która zwróci pojedynczy obiekt artefaktu. To właściwie produkuje XML:

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

Tu udało mi się skutecznie kontrolować nazwę elementu Artifact mieć kapitałową „A” na początku.

jednak utworzyć metody GET, która zwraca kolekcję obiektów artefakt I skończyć z:

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

Jak widać zewnętrzną elementem kolekcja ma małe litery „A”. Aby dostosować się do naszego wewnętrznego standardu, chciałbym, aby było to wielkie "A" - Artefakty.

Nie widzę, gdzie można to zdefiniować w ramach JAXB, czy faktycznie to struktura Jersey kontroluje to?

Czy możemy kontrolować nazwę elementu wygenerowaną dla kolekcji?

Dziękujemy,

James

+1

1. AFAIK JAXB nie pozwalają na Marshall zbiór (na przykład '' ArrayList ) jako takie. Ale pozwala serializować obiekt, który ma kolekcję jako właściwość. 2.Nie znam Jersey, ale myślę, że musisz wiedzieć, czy to JAXB, który serializuje każdy artefakt osobno, a inna warstwa (Jersey) buduje cały dokument kawałków, czy to JAXB, który tworzy XML dla kolekcji. 3. Czy możesz napisać jakiś kod (lub opublikować go gdzieś) - jak go nazwać? Próbowałem z prostym JAXB, ale to nie naśladuje twojej konfiguracji. –

+1

Podejrzewam, że masz rację - to jest Jersey, który pozwala mi organizować i usuwać kolekcję fasoli JAXB (podniosłem to również z grupą użytkowników z Jersey). Dlatego mam nadzieję, że istnieje pewna konfiguracja, która pozwala mi ustawić nazwę lub reguły kryjące się za nazwą elementu XML dla kolekcji ... Musimy poczekać i zobaczyć. Jak wskazujesz, rozwiązaniem jest utworzenie nowego komponentu bean JAXB - powiedzmy "Artefakty", który ma jednego elementu kolekcji, np. Lista artefaktów - to wydaje mi się, że wprowadzam całą masę zajęć, które nie dodają wiele wartości. Dzięki za pomoc. James – jallch

Odpowiedz

9

Spróbuj użyć @XmlElementWrapper który obsługuje atrybut name:

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

będzie produkować

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

Zobacz JAXB Tutorial dla tej funkcji.

+1

Cześć, niestety jestem świadomy XmlElementWrapper, ale nie ma to zastosowania w moim przypadku użycia. W Jersey można produkować i konsumować zbiory fasoli JAXB. na przykład Publiczna lista getMyBeans Nie można użyć XmlElementWrapper do adnotacji klasy MyBean - można używać tylko tej adnotacji do właściwości klasy, np. kolekcja w klasie. Więc nie byłoby dobrze. Jest takie rozwiązanie, że mogę użyć nowej klasy, która zawiera kolekcję - ale szczerze mówiąc, to stworzenie klasy w projekcie, która tak naprawdę nie jest wymagana. – jallch

+0

Dobrą rzeczą w XML jest: można go przekształcać na 1000 sposobów;) Można użyć ** XSLT ** lub ** DOM **. –

+0

wielkie dzięki, twoje rozwiązanie rozwiązało kolejny problem z serializacją list. – Pragmateek

5

OK - Miałem aktualizację od lidera społeczności Java Jersey - Paula Sandoza. Jest to obecnie otwarty problem ze strukturą Jersey i tylko coś, co będziemy musieli obejść lub zaakceptować, dopóki nie zostanie naprawiony w przyszłej aktualizacji.

Sposób obejścia opisany w jednym z powyższych komentarzy to wprowadzenie nowej klasy dla każdej metody usługi WWW, która zwraca kolekcję (np. Lista) fasoli z adnotacjami JAXB. Ta klasa jest faktycznie klasą zawierającą tylko jeden element - listę komponentów bean JAXB. Zamiast zwracania Listy w metodzie usługi sieciowej zwracamy zamiast tego klasę specjalną. Ponieważ mamy kontrolę nad nazwą nowej klasy w XML, np. @XmlRootElement (name = "Artifacts") możemy obejść problem w krótkim czasie.

Mam nadzieję, że to pomoże.

Pozdrawiam,

James

+0

Czy wiesz, czy istnieje rozwiązanie w obecnej wersji Jersey (1.11)? Czy jakikolwiek wskaźnik do dyskusji/wydania na Jersey dotyczący tej funkcji? – Yaegor

Powiązane problemy