如何将JSON对象发布到JAX-RS服务

我正在使用JAX-RS的Jersey实现。 我想发布一个JSON对象到这个服务,但我得到一个错误代码415不支持的媒体types。 我错过了什么?

这是我的代码:

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

这是Order对象:

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

像这样的GET请求完美地工作,并返回一个JSON格式的订单:

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

然而像这样的POST请求返回一个415:

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

答案非常简单。 我不得不在POST请求中添加一个application/json值的Content-Type头。 如果没有这个头文件,Jersey不知道如何处理请求体(尽pipe有@Consumes(MediaType.APPLICATION_JSON)注解)!

Jersey使得这个过程变得非常简单,我的服务类与JSON一起工作良好,我只需要在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; } } 

并在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> 

发送对象时,我经历了同样的415 http错误,通过对我的JAX-rs服务的PUT / PUSH请求序列化成JSON,换句话说,我的服务器无法从JSON反序列化对象。 在我的情况下,服务器能够成功序列化成JSON相同的对象时,发送到它的响应。

正如其他回复中提到的,我已经正确地将AcceptContent-Type头文件设置为application/json ,但是这并不够用。

我简单地忘记了我的DTO对象没有参数的默认构造函数。 是的,这与@Entity对象背后的推理是一样的,你需要一个没有参数的构造函数来实现对象的实例化,以后再填充字段。

添加没有参数的构造函数到我的DTO对象解决了我的问题。 下面是一个类似于我的代码的例子:

错误

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

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

我失去了几个小时,我希望这会拯救你;-)