2009-10-09 10 views
5

Possiedo un numero di bean JAXB che sono direttamente sottoposti a marshalling e unmarshalled utilizzando Jersey.Raccolte JAXB (elenco <T>) Utilizzare la custodia Pascal anziché la custodia Camel per i nomi degli elementi

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; 

... 
... 
... 

} 

Se creo un metodo GET che restituisce un oggetto artefatto singolo. Produce correttamente il codice XML:

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

Qui sono stato in grado di controllare con successo il nome dell'elemento Artefatto di avere una "A" maiuscola all'inizio.

Tuttavia, creare un metodo GET che restituisce raccolta di oggetti artefatto, io alla fine con:

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

Come si può vedere l'elemento esterno per la collezione ha un minuscolo "A". Per conformarmi al nostro standard interno vorrei che questa fosse una "A" maiuscola: Artefatti.

Non riesco a vedere dove è possibile definire all'interno di JAXB, è in realtà la struttura di Jersey che sta controllando questo?

È possibile controllare il nome dell'elemento generato per le raccolte?

Molte grazie,

James

+1

1. per quanto ne so JAXB non ti permettono di marshall una collezione (ad esempio '' ArrayList ) in quanto tale. Ma ti permette di serializzare un oggetto che ha una collezione come una proprietà. 2.Non ho familiarità con Jersey, ma credo che sia necessario sapere se è JAXB che serializza ciascun artefatto separatamente e qualche altro layer (Jersey) crea l'intero documento dei blocchi o è JAXB che proclama XML per la raccolta. 3. Potresti postare del codice (o pubblicarlo da qualche parte) - come chiamarlo? Stavo provando con JAXB semplice ma questo non imita il tuo set up. –

+1

Sospetto che tu abbia ragione - è Jersey che mi permette di marcare/smontare la raccolta di fagioli JAXB (ho sollevato anche questo con il gruppo di utenti di Jersey). Quindi spero che ci sia qualche configurazione che mi permetta di impostare il nome o le regole dietro il nome dell'elemento XML per le collezioni ... Dovremo aspettare e vedere. Come fai notare, una soluzione alternativa è creare un nuovo bean JAXB, diciamo "Artifacts" che ha un singolo membro della collezione, ad es. Elenca gli artefatti , ma credo che introduca un intero gruppo di classi che non aggiungono molto valore. Grazie per l'aiuto. James – jallch

risposta

9

Prova utilizzando @XmlElementWrapper che supporta l'attributo name:

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

produrrà

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

Vedere la JAXB Tutorial per questa funzione.

+1

Salve, sfortunatamente sono a conoscenza di XmlElementWrapper ma non si applica al mio caso d'uso. All'interno di Jersey puoi produrre e consumare raccolte di fagioli JAXB. per esempio. elenco pubblico getMyBeans Non è possibile utilizzare XmlElementWrapper per annotare la classe MyBean: è possibile utilizzare questa annotazione solo su una proprietà della classe, ad es. una collezione all'interno della classe. Quindi questo non sarebbe buono. C'è una soluzione in cui potrei usare una nuova classe che contiene una collezione - ma per essere onesti è la creazione di una classe all'interno del design che non è realmente necessaria. – jallch

+0

La cosa buona di XML è: può essere trasformata in 1000 modi;) Puoi usare ** XSLT ** o ** DOM **. –

+0

grazie mille, la tua soluzione ha risolto un altro problema con la serializzazione delle liste. – Pragmateek

5

OK - Ho avuto un aggiornamento dal leader della comunità Java Jersey - Paul Sandoz. Questo è attualmente un problema aperto con il framework di Jersey e solo qualcosa che dovremo risolvere o accettare fino a quando non verrà corretto in un aggiornamento futuro.

La soluzione, come spiegato in uno dei commenti sopra riportati, è di introdurre una nuova classe per ciascun metodo di servizio Web che restituisce una raccolta (ad esempio Elenco) di bean con annotazione JAXB. Questa classe è effettivamente una classe che contiene solo un membro: un elenco dei bean JAXB. Invece di restituire l'Elenco nel metodo del servizio web, restituiamo invece la classe speciale. Perché abbiamo il controllo sul nome della nuova classe nel codice XML, ad es. @XmlRootElement (name = "Artifacts") possiamo risolvere il problema a breve termine.

Spero che questo aiuti.

saluti,

James

+0

Sai se esiste una soluzione nell'attuale versione di Jersey (1.11)? O qualsiasi puntatore alla discussione/problema di Jersey sulla funzione? – Yaegor

Problemi correlati