servicios servicio objeto ejemplo crear convertir consumir consume array json jersey jax-rs

ejemplo - Cómo POSTAR un objeto JSON a un servicio JAX-RS



json.stringify array (3)

Enfrenté el mismo error 415 http al enviar objetos, serializados en JSON, a través de solicitudes PUT / PUSH a mis servicios JAX-rs, en otras palabras, mi servidor no pudo des-serializar los objetos de JSON. En mi caso, el servidor pudo serializar con éxito los mismos objetos en JSON al enviarlos a sus respuestas.

Como se mencionó en las otras respuestas, he establecido correctamente los encabezados Accept y Content-Type en application/json , pero no es suficiente.

Solución

Simplemente olvidé un constructor predeterminado sin parámetros para mis objetos DTO. Sí, este es el mismo razonamiento detrás de los objetos @Entity, necesita un constructor sin parámetros para que el ORM cree una instancia de los objetos y rellene los campos más adelante.

Agregar el constructor sin parámetros a mis objetos DTO resolvió mi problema. Aquí sigue un ejemplo que se parece a mi código:

Incorrecto

@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class NumberDTO { public NumberDTO(Number number) { this.number = number; } private Number number; public Number getNumber() { return number; } public void setNumber(Number string) { this.number = string; } }

Derecha

@XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class NumberDTO { public NumberDTO() { } public NumberDTO(Number number) { this.number = number; } private Number number; public Number getNumber() { return number; } public void setNumber(Number string) { this.number = string; } }

Perdí horas, espero que esto te salve la tuya ;-)

Estoy usando la implementación de JAX-RS en Jersey. Me gustaría enviar un objeto JSON a este servicio, pero obtengo un código de error 415 Tipo de medio no compatible. ¿Qué 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; } }

Aquí está el objeto Orden:

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

Una solicitud GET como esta funciona perfectamente y devuelve un pedido en formato JSON:

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

Sin embargo, una solicitud POST como esta devuelve un 415:

POST http://localhost:8080/jaxrs-oms/rest/orders HTTP/1.1 { "id": "123", "symbol": "AAPL", "side": "Buy", "quantity": "1000" }


Jersey hace que el proceso sea muy fácil, mi clase de servicio funcionó bien con JSON, todo lo que tuve que hacer es agregar las dependencias en el 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>


La respuesta fue sorprendentemente simple. Tuve que agregar un encabezado de Content-Type en la solicitud POST con un valor de application/json . Sin este encabezado, Jersey no sabía qué hacer con el cuerpo de la solicitud (a pesar de la @Consumes(MediaType.APPLICATION_JSON) ).