2009-10-09 16 views
5

Tengo un número de beans JAXB que se agrupan directamente y no se combinan usando Jersey.Colecciones JAXB (Lista <T>) Use Pascal Case en lugar de Camel Case para los nombres de elemento

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; 

... 
... 
... 

} 

Si creo un método GET que devuelve un único objeto artefacto. Se produce correctamente el código XML:

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

Aquí he podido controlar correctamente el nombre del elemento Artefacto para tener una "A" mayúscula al principio.

Sin embargo, creo un método GET que devuelve colección de objetos de artefactos, termino 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> 

Como se puede ver el elemento exterior para la colección tiene una minúscula "A". Para cumplir con nuestro propio estándar interno, me gustaría que sea una "A" mayúscula: artefactos.

No puedo ver dónde es posible definir esto dentro de JAXB, ¿es realmente el marco de Jersey el que está controlando esto?

¿Se puede controlar el nombre del elemento generado para las colecciones?

Muchas gracias,

James

+1

1. Que yo sepa JAXB no le permiten ordenar de una colección (por ejemplo '' ArrayList) como tal. Pero le permite serializar un objeto que tiene una colección como propiedad. 2.No estoy familiarizado con Jersey, pero supongo que necesita saber si es JAXB el que serializa cada artefacto por separado y alguna otra capa (Jersey) construye el documento completo de los fragmentos o es JAXB el que obtiene XML para la colección. 3. ¿Podría publicar algún código (o publicarlo en alguna parte) - cómo llamarlo? Lo estaba intentando con JAXB simple, pero esto no imita tu configuración. –

+1

Sospecho que tienes razón, es Jersey quien me permite ordenar/deshacer la colección de beans JAXB (también he mencionado esto con el grupo de usuarios de Jersey). Por lo tanto, espero que haya alguna configuración que me permita establecer el nombre o las reglas detrás del nombre del elemento XML para colecciones ... Esperaremos y veremos. Como usted señala, una solución alternativa es crear un nuevo bean JAXB, digamos "Artefactos" que tiene un solo miembro de colección, p. Objetos de la lista : sin embargo, creo que esto presenta un montón de clases que no agregan mucho valor. Gracias por la ayuda. James – jallch

Respuesta

9

Trate de usar @XmlElementWrapper que soporta el atributo name:

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

producirá

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

Véase el JAXB Tutorial para esta función.

+1

Hola, lamentablemente conozco el XmlElementWrapper, pero no se aplica a mi caso de uso. Dentro de Jersey puede producir y consumir colecciones de judías JAXB. p.ej. public List getMyBeans No se puede usar XmlElementWrapper para anotar la clase MyBean; solo se puede usar esta anotación contra una propiedad de la clase, p. una colección dentro de la clase. Entonces esto no sería bueno. Existe una solución en el sentido de que podría usar una clase nueva que contenga una colección, pero para ser honesto, eso crea una clase dentro del diseño que no es realmente necesaria. – jallch

+0

Lo bueno de XML es: se puede transformar de 1000 maneras;) Puede usar ** XSLT ** o ** DOM **. –

+0

muchas gracias, su solución ha resuelto otro problema con la serialización de listas. – Pragmateek

5

OK - He tenido una actualización del líder de la comunidad Java Jersey - Paul Sandoz. Este es actualmente un problema abierto con el framework de Jersey y simplemente algo que tendremos que solucionar o aceptar hasta que se solucione en una actualización futura.

La solución, tal como se explica en uno de los comentarios anteriores, es introducir una nueva clase para cada método de servicio web que devuelve una colección (por ejemplo, Lista) de beans anotados JAXB. Esta clase es efectivamente una clase que contiene solo un miembro: una lista de beans JAXB. En lugar de devolver la Lista en el método del servicio web, devolvemos la clase especial. Porque tenemos control sobre el nombre de la nueva clase en el XML, p. @XmlRootElement (name = "Artifacts") podemos solucionar el problema a corto plazo.

Espero que esto ayude.

Saludos,

James

+0

¿Sabes si hay una solución en la versión actual de Jersey (1.11)? O cualquier puntero a la discusión/problema de Jersey en la función? – Yaegor