Как разместить объект JSON в службе JAX-RS
Я использую реализацию Джерси JAX-RS. Я хотел бы опубликовать объект 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;
}
}
вот объект заказа:
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"
}
3 ответов:
ответ был удивительно прост. Я должен был добавить на
POSTзапрос со значениемapplication/json. Без этого заголовка Джерси не знал, что делать с телом запроса (несмотря на@Consumes(MediaType.APPLICATION_JSON)аннотации)!
Джерси делает процесс очень легким, мой класс обслуживания хорошо работал с 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; } }и в ПОМ.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 при отправке объектов, сериализованных в 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; } }Я потерял часы, я надеюсь, что это спасет ваш ;-)
Comments