Posteado por: edeortuzar | 07/11/2013

Devolver una colección en un servicio RESTEasy cambiando el nombre del default Collection


Hacer un servicio RESTEasy es muy simple


@GET
@Path("/customers")
@Produces(MediaType.APPLICATION_XML)
public List<Customer> getCustomer()
{
    List<Customer> customers = new ArrayList<Customer>();

    customers.add(new Customer("1", "customer1", "some address 1", 20));
    customers.add(new Customer("2", "customer2", "some address 2", 45));
    customers.add(new Customer("3", "customer3", "some address 3", 36));

    return customers;
}

Como pueden ver hay que utilizar varias anotaciones (annotations). Una es @Get para especificar de que tipo es el servicio, @Path para especificar como va a ser la URL de acceso al servicio y @Produces es donde podemos especificar que queremos la salida como un XML. El método es como cualquier otro método.

Luego tenemos nuestro objeto(POJO) Customer donde veremos mas anotaciones. A nivel clase @XmlAccessorType para establecer que vamos a acceder por campos, @XmlRootElement para establecer que la clase va a ser el nivel root del XML. Luego por cada atributo que queramos exponer le tendremos que especificar, a la declaración privada del atributo, la anotación @XmlAttribute.

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Customer 
{
    @XmlAttribute
    private String customerId;

    @XmlElement
    private String name;

    @XmlElement
    private String address;

    @XmlElement
    private int age;

    public Customer()
    {

    }

    public Customer(String customerId, String name, String address, int age)
    {
        this.customerId = customerId;
        this.name = name;
        this.address = address;
        this.age = age;
    }

    public String getCustomerId() 
    {
        return customerId;
    }

    public void setCustomerId(String customerId) 
    {
        this.customerId = customerId;
    }

    public String getName() 
    {
        return name;
    }

    public void setName(String name) 
    {
        this.name = name;
    }

    public String getAddress()
    {
        return address;
    }

    public void setAddress(String address)
    {
        this.address = address;
    }

    public int getAge() 
    {
        return age;
    }

    public void setAge(int age) 
    {
        this.age = age;
    }
}

El XML de salida será:

<?xml version="1.0" encoding="UTF-8"?>
<collection>
    <customer customerId="1">
        <name>customer1</name>
        <address>some address 1</address>
        <age>20</age>
    </customer>
    <customer customerId="2">
        <name>customer2</name>
        <address>some address 2</address>
        <age>45</age>
    </customer>
    <customer customerId="3">
        <name>customer3</name>
        <address>some address 3</address>
        <age>36</age>
    </customer>
</collection>

Como vemos responde como elemento padre Collection, entonces si queremos cambiar esto, por ejemplo a Customers, es muy simple, nuevamente con una anotación, en este caso @Wrapped donde especificaremos el parámetro element=”nombre que querramos”. Por lo que nuestro método ahora quedará así:

@GET
@Path("/customers")
@Produces(MediaType.APPLICATION_XML)
@Wrapped(element = "customers")
public List<Customer> getCustomer()
{
    List<Customer> customers = new ArrayList<Customer>();

    customers.add(new Customer("1", "customer1", "some address 1", 20));
    customers.add(new Customer("2", "customer2", "some address 2", 45));
    customers.add(new Customer("3", "customer3", "some address 3", 36));

    return customers;
}

Y el XML de salida será finalmente:

<?xml version="1.0" encoding="UTF-8"?>
<customers>
    <customer customerId="1">
        <name>customer1</name>
        <address>some address 1</address>
        <age>20</age>
    </customer>
    <customer customerId="2">
        <name>customer2</name>
        <address>some address 2</address>
        <age>45</age>
    </customer>
    <customer customerId="3">
        <name>customer3</name>
        <address>some address 3</address>
        <age>36</age>
    </customer>
</customers>

Espero que les sirva.

Saludos.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: