Как разместить объект 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"
}
548   3  

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

    Ничего не найдено.