parse jaxbcontext jaxb2marshaller example bean java xml spring rest jaxb

java - jaxbcontext - Programa REST de Spring 4 para devolver una lista en XML utilizando JAXB



xml to java jaxb (2)

Estoy tratando de implementar un servicio REST usando Spring 4.

El método REST devolverá una lista de objetos del cliente en XML. La aplicación es impulsada por anotaciones.

Para XML, he usado anotaciones JAXB. Según tengo entendido, Spring usará "Jaxb2RootElementHttpMessageConverter" cuando encuentre las anotaciones de JAXB.

El cliente POJO:

@XmlRootElement(name = "customer") public class Customer { private int id; private String name; private List favBookList; @XmlAttribute public int getId() { return id; } public void setId(int id) { this.id = id; } @XmlElement public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElementWrapper(name = "booklist") @XmlElement(name="book") public List getFavBookList() { return favBookList; } public void setFavBookList(List favBookList) { this.favBookList = favBookList; } }

He anotado la clase de servicio REST como @RestController (según Spring 4)

El método REST para devolver una lista de clientes en XML:

@RequestMapping(value="/customer-list.xml",produces="application/xml") public List<Customer> getCustomerListInXML(){ List<Customer> customerList = new ArrayList<Customer>(); Customer customerObj1 = new Customer(); customerObj1.setId(1); customerObj1.setName("Vijay"); ArrayList<String> favBookList1 = new ArrayList<String>(); favBookList1.add("Book1"); favBookList1.add("Book2"); customerObj1.setFavBookList(favBookList1); customerList.add(customerObj1); Customer customerObj2 = new Customer(); customerObj2.setId(2); customerObj2.setName("Rajesh"); ArrayList<String> favBookList2 = new ArrayList<String>(); favBookList2.add("Book3"); favBookList2.add("Book4"); customerObj2.setFavBookList(favBookList2); customerList.add(customerObj2); return customerList; }

El resultado que esperaba, cuando presiono la URL:

<customers> <customer id="1"> <booklist> <book xsi:type="xs:string">Book1</book> <book xsi:type="xs:string">Book2</book> </booklist> <name>Vijay</name> </customer> <customer id="2"> <booklist> <book xsi:type="xs:string">Book3</book> <book xsi:type="xs:string">Book4</book> </booklist> <name>Rajesh</name> </customer> </customers>

Lo que consigo :

HTTP 406: el recurso identificado por esta solicitud solo es capaz de generar respuestas con características no aceptables de acuerdo con los encabezados de "aceptación" de la solicitud.

Nota :

Cuando intento devolver un objeto Customer en XML, funciona como se esperaba. Sin embargo, no puedo devolver una lista de objetos de Cliente en XML.

La aplicación se desarrolla utilizando java 7 y se ejecuta en Tomcat 7.

Necesito ayuda con esto Gracias.


406 No aceptable El recurso identificado por la solicitud solo es capaz de generar entidades de respuesta que tienen características de contenido no aceptables de acuerdo con los encabezados de aceptación enviados en la solicitud.

Su servicio de fondo responde que el tipo de respuesta que devuelve no se proporciona / o es diferente en el Accept-Type HTTP header en su solicitud.

Descubra el tipo de contenido de respuesta devuelto por su servidor. Proporcione este tipo de contenido en el valor de encabezado Aceptación HTTP de su solicitud. http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html Códigos de estado HTTP

Otras observaciones Creo que debería usar el tipo parametrizado de Lista.

private List<String> favBookList; public List<String> getFavBookList() { return favBookList; } public void setFavBookList(List<String> favBookList) { this.favBookList = favBookList; }


Pude generar un XML de la lista de clientes.

Primero crea una clase contenedora genérica (La intención detrás de esto es usar esta clase genérica para pasar una lista de objetos de cualquier clase).

La clase de envoltura genérica:

@XmlRootElement @XmlSeeAlso({Customer.class}) public class EntityList<T> { private List<T> listOfEntityObjects; public EntityList() { listOfEntityObjects = new ArrayList<T>(); } public EntityList(List<T> listOfEntityObjects) { this.listOfEntityObjects = listOfEntityObjects; } @XmlAnyElement public List<T> getItems() { return listOfEntityObjects; }

El método REST modificado:

@RequestMapping(value="/customer-list.xml",produces="application/xml") public EntityList<Customer> getCustomerListInXML(){ List<Customer> customerList = new ArrayList<Customer>(); Customer customerObj1 = new Customer(); customerObj1.setId(1); customerObj1.setName("Vijay"); ArrayList<String> favBookList1 = new ArrayList<String>(); favBookList1.add("Book1"); favBookList1.add("Book2"); customerObj1.setFavBookList(favBookList1); customerList.add(customerObj1); Customer customerObj2 = new Customer(); customerObj2.setId(2); customerObj2.setName("Rajesh"); ArrayList<String> favBookList2 = new ArrayList<String>(); favBookList2.add("Book3"); favBookList2.add("Book4"); customerObj2.setFavBookList(favBookList2); customerList.add(customerObj2); EntityList<Customer> listOfCustomers = new EntityList<Customer> (customerList); return listOfCustomers; }

La respuesta XML:

<entityList> <customer id="1"> <booklist> <book xsi:type="xs:string">Book1</book> <book xsi:type="xs:string">Book2</book> </booklist> <name>Vijay</name> </customer> <customer id="2"> <booklist> <book xsi:type="xs:string">Book3</book> <book xsi:type="xs:string">Book4</book> </booklist> <name>Rajesh</name> </customer> </entityList>

Nota :

El elemento raíz del XML generado es entityList (que se toma del nombre de la clase contenedora)

Sin embargo, me gustaría que XML Root Element sea el plural del nombre de la entidad, es decir, clientes en este caso.

¿Alguna idea o sugerencia?