62 votos

Cómo PUBLICAR un objeto JSON a un JAX-RS servicio

Estoy usando la camiseta de la aplicación de JAX-RS. Me gustaría PUBLICAR un objeto JSON a este servicio, pero estoy recibiendo un código de error 415 Unsupported Media Type. Lo que me estoy perdiendo?

Aquí está mi código:

@Path("/orders")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class OrderResource {

    private static Map<Integer, Order> orders = new HashMap<Integer, Order>();

    @POST
    public void createOrder(Order order) {

        orders.put(order.id, order);
    }

    @GET
    @Path("/{id}")
    public Order getOrder(@PathParam("id") int id) {
        Order order = orders.get(id);
        if (order == null) {
            order = new Order(0, "Buy", "Unknown", 0);
        }
        return order;
    }
}

He aquí el objeto de Pedido:

public class Order {
    public int id;
    public String side;
    public String symbol;
    public int quantity;
    ...
}

Una petición GET como este funciona a la perfección y devuelve un pedido en formato JSON:

GET http://localhost:8080/jaxrs-oms/rest/orders/123 HTTP/1.1

Sin embargo, una petición POST como este devuelve un 415:

POST http://localhost:8080/jaxrs-oms/rest/orders HTTP/1.1

{
    "id": "123",
    "symbol": "AAPL",
    "side": "Buy",
    "quantity": "1000"
}

74voto

Naresh Puntos 2107

La respuesta fue sorprendentemente simple. He tenido que añadir un Content-Type de encabezado en la POST solicitud con un valor de application/json. Sin este encabezado Jersey no sabía qué hacer con el cuerpo de solicitud (a pesar de la @Consumes(MediaType.APPLICATION_JSON) de anotación)!

11voto

glm Puntos 21

Jersey hace el proceso muy fácil, mi clase de servicio trabajado bien con Json, todo lo que tenía que hacer es agregar las dependencias en la pom.xml

@Path("/customer")
public class CustomerService {

private static Map<Integer, Customer> customers = new HashMap<Integer, Customer>();

@POST 
@Path("save")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public SaveResult save(Customer c){

    customers.put(c.getId(), c);

    SaveResult sr = new SaveResult();
    sr.sucess = true;
    return sr;
}

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("{id}")
public Customer getCustomer(@PathParam("id") int id) {
    Customer c = customers.get(id);
    if (c == null) {
        c = new Customer();
        c.setId(id * 3);
        c.setName("unknow " + id);
    }
    return c;
}
}

Y en el pom.xml

 <dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.7</version>
 </dependency>
 <dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.7</version>
 </dependency>
 <dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.7</version>
 </dependency>

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: