我正在使用JAX-RS的Jersey实现。我想POST一个JSON对象到这个服务,但我得到一个错误代码415不支持的媒体类型。我错过了什么?
这是我的代码:
@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"
}
答案 0 :(得分:75)
答案非常简单。我必须在Content-Type
请求中添加POST
标头,其值为application/json
。没有这个标题,泽西岛不知道如何处理请求体(尽管有@Consumes(MediaType.APPLICATION_JSON)
注释)!
答案 1 :(得分:12)
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>
答案 2 :(得分:6)
我在发送对象时遇到了同样的415
http错误,序列化为JSON,通过PUT / PUSH请求到我的JAX-rs服务,换句话说我的服务器无法从JSON反序列化对象。
就我而言,服务器能够在将JSON中的相同对象发送到其响应中时成功序列化。
正如其他回复中所述,我已将Accept
和Content-Type
标题正确设置为application/json
,但这还不够。
<强>解决方案强>
我只是忘记了一个没有DTO对象参数的默认构造函数。是的,这与@Entity对象背后的原因相同,您需要一个没有参数的构造函数,以便ORM实例化对象并在以后填充这些字段。
将没有参数的构造函数添加到我的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;
}
}
我失去了几个小时,我希望这会拯救你的; - )