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)
).