2009-10-09 14 views
5

Jersey kullanarak doğrudan marshalled ve unmarshalled bir dizi JAXB fasulye var.JAXB Koleksiyonlar (Liste <T>) Element Adları için Camel Case yerine Pascal Case kullanın

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; 

... 
... 
... 

} 

Tek bir nesne nesnesini döndüren bir GET yöntemi oluşturursam. İşte

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

başarıyla başında büyük harf "A" olması Artifakt elemanın adını kontrol etmek mümkün olmuştur: O XML doğru üretir. Eğer koleksiyonu küçük harf "A" vardır için dış eleman görebileceğiniz gibi

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

:

Ancak, yapay nesnelerin koleksiyonunu döndüren bir GET yöntemini oluşturmak, ben ile bitirmek. Kendi iç standartlarımıza uymak için bunun bir "A" - Artefaktlar olmasını istiyorum.

JAXB içinde tanımlamanın nerede mümkün olduğunu göremiyorum, aslında bunu kontrol eden Jersey çerçevesi mi?

Koleksiyonlar için oluşturulan öğe adını kontrol edebilir miyiz?

Çok teşekkürler,

James

+1

1. AFAIK JAXB marshall'a gibi (' örneğin' ArrayList) bir koleksiyon sizi izin vermez. Ancak, bir koleksiyon olarak bir mülk olan bir nesneyi serileştirmenize izin verir. 2.Jersey'le aşina değilim, ama sanırım her bir nesneyi ayrı ayrı serileştiren JAXB olup olmadığını ve diğer bazı katmanların (Jersey) parçaların tüm belgesini oluşturduğunu ya da koleksiyon için XML'yi sağlayan JAXB olduğunu bilmeniz gerekir. 3. Bazı kodları gönderebilir misiniz (veya bir yerde yayınlayabilirsiniz) - nasıl adlandırılır? Basit JAXB ile çalışıyordum ama bu sizin kurulumunuzu taklit etmiyor. –

+1

Haklı olduğunuzu sanıyorum - bu JAXB fasulyelerinin koleksiyonunu marshall/unmarshall'e izin veren Jersey'tir (bunu Jersey kullanıcı grubuyla da geliştirdim). Bu yüzden koleksiyonlar için XML element isminin arkasındaki ismi veya kuralları belirlememe izin veren bir yapılandırma olduğunu umuyorum ... Bekleyelim ve göreceğiz. İşaret ettiğin gibi, yeni bir JAXB fasulyesi yaratmak için bir geçici çözüm var. Tek bir koleksiyon üyesi olan "Artifacts" diyelim. eserlerinin listesi - bu, çok fazla değer eklemeyen bir sürü sınıf tanıttığını düşünüyorum. Yardım için teşekkürler. James – jallch

cevap

9

name özelliğini destekler @XmlElementWrapper kullanmayı deneyin:

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

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

bu özellik için JAXB Tutorial Bkz üretecek.

+1

Merhaba, maalesef XmlElementWrapper'ın farkındayım ancak kullanım durumum için geçerli değil. Jersey'de JAXB fasulyelerinin koleksiyonlarını üretebilir ve tüketebilirsiniz. Örneğin. public List getMyBeans MyBean sınıfına açıklama eklemek için XmlElementWrapper kullanamazsınız; bu açıklamayı yalnızca sınıfın bir özelliğine karşı kullanabilirsiniz. sınıf içindeki bir koleksiyon. Yani bu iyi olmaz. Bir koleksiyon içeren yeni bir sınıf kullanabilmem için bir çözüm var - ama dürüst olmak gerekirse, gerçekten gerekli olmayan tasarım içinde bir sınıf yaratıyor. – jallch

+0

XML hakkında iyi bir şey: 1000 yolla dönüştürülebilir;) ** XSLT ** veya ** DOM ** kullanabilirsiniz. –

+0

çok teşekkürler, çözümünüz listelerin serileştirilmesiyle başka bir sorunu çözdü. – Pragmateek

5

Tamam - Java Jersey topluluk lideri Paul Sandoz'dan bir güncelleme aldım. Bu, Jersey çerçevesiyle ilgili açık bir sorundur ve yalnızca gelecekteki bir güncellemede düzeltilene kadar geçici bir çözüm veya kabul etmemiz gereken bir şeydir.

Yukarıdaki yorumlardan birinde açıklanan geçici çözüm, JAXB açıklamalı fasulyelerin bir koleksiyonunu (ör. Liste) veren her web hizmeti yöntemi için yeni bir sınıf tanıtmaktır. Bu sınıf, sadece bir üye içeren bir sınıftır - JAXB fasulyelerinin bir listesi. Listeyi web hizmeti yöntemine döndürmek yerine, bunun yerine özel sınıfı döndürürüz. Çünkü XML'deki yeni sınıfın adı üzerinde kontrolümüz var, ör. @XmlRootElement (name = "Artifacts") sorunu kısa vadede çözebiliriz.

Bu yardımcı olur umarım.

Selamlar,

James

+0

Geçerli Jersey sürümünde (1.11) bir çözüm olup olmadığını biliyor musunuz? Veya bu konuyla ilgili Jersey tartışması/konusuyla ilgili herhangi bir işaretçi? – Yaegor