73 votes

Comment publier un objet JSON sur un service JAX-RS

J'utilise l'implémentation Jersey de JAX-RS. Je voudrais POSTER un objet JSON à ce service mais j'obtiens un code d'erreur 415 Type de support non pris en charge. Qu'est-ce que je rate?

Voici mon code :

 @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;
    }
}

Voici l'objet Order :

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

Une requête GET comme celle-ci fonctionne parfaitement et renvoie une commande au format JSON :

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

Cependant, une requête POST comme celle-ci renvoie un 415 :

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

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

83voto

Naresh Points 2107

La réponse était étonnamment simple. Je devais ajouter un Content-Type en- tête dans le POST demande avec une valeur de application/json . Sans cet en-tête, Jersey ne savait pas quoi faire du corps de la requête (malgré l' @Consumes(MediaType.APPLICATION_JSON) ) !

13voto

glm Points 21

Jersey rend le processus très facile, ma classe de service fonctionnait bien avec JSON, tout ce que j'avais à faire était d'ajouter les dépendances dans le 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;
    }
}

Et dans le 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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X