Jersey JAX-RS пример работы с JSON

Рассмотрим пример REST-сервиса для работы с Json. Для того, чтобы Jersey мог работать с json необходимо добавить зависимость:

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.8</version>
</dependency>


Теперь необходимо в web.xml указать необходимость маппинга pojo-классов на json. Добавляем следующий параметр в сервлет jersey:

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

Целиком web.xml выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
           version="3.0">

    <servlet>
        <servlet-name>jersey-servlet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>ru.mydesignstio.jaxrs</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jersey-servlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
</web-app>

Теперь определим класс, который, который будем сериализовать в Json:

package ru.mydesignstio.jaxrs.model;

public class Person {
    private String name;
    private String id;

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", id='" + id + '\'' +
                '}';
    }
}

И, собственно, класс сервиса:

package ru.mydesignstio.jaxrs.service;

import ru.mydesignstio.jaxrs.model.Person;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/person")
public class PersonService {

    @GET
    @Path("/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Person getPerson(
            @PathParam("id") String id){

        Person person = new Person();
        person.setName("MyDesignStudio");
        person.setId(id);
        return person;
    }

    @POST
    @Consumes("application/json")
    public String setPerson(Person person) {

        return person.toString();
    }
}

У сервиса два метода – один возвращает объект в виде json:

@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Person getPerson(
        @PathParam("id") String id){

    Person person = new Person();
    person.setName("MyDesignStudio");
    person.setId(id);
    return person;
}

Другой принимает POST-запрос с json-объектом и возвращает его строковое представление:

@POST
@Consumes("application/json")
public String setPerson(Person person) {

    return person.toString();
}

Обратимся с GET-запросом к сервису:

Jersey JAX-RS пример работы с JSON
Jersey JAX-RS пример работы с JSON

А теперь отправим результат GET-запроса в виде POST-запроса в сервис с помощью IntelliJ IDEA REST Client:

Jersey JAX-RS пример работы с JSON
Jersey JAX-RS пример работы с JSON

Здесь важно указать Content-Type: application/json , иначе будет следующая ошибка:

SEVERE: A message body reader for Java class ru.mydesignstio.jaxrs.model.Person, and Java type class ru.mydesignstio.jaxrs.model.Person, and MIME media type */*; charset=UTF-8 was not found.
The registered message body readers compatible with the MIME media type are:
*/*; charset=UTF-8 ->
  com.sun.jersey.core.impl.provider.entity.FormProvider
...

Ответ сервера:

Jersey JAX-RS пример работы с JSON
Jersey JAX-RS пример работы с JSON