JAX-RS JSON REST сервис. GET

Сделаем простой JSON REST-сервис, который по запросу возвращает данные в формате json. Для начала определим модель возвращаемых данных в виде простого java-бина:

package ru.datatech.testProject.domain.category;

import java.util.ArrayList;
import java.util.List;

public class Category {
    private String id;
    private String title;
    private List<Category> children = new ArrayList<Category>();

    public Category() {
    }

    public Category(String id, String title) {
        this.id = id;
        this.title = title;
    }

    public String getId() {
        return id;
    }

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

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List<Category> getChildren() {
        return children;
    }

    public void setChildren(List<Category> children) {
        this.children = children;
    }
}

Теперь определим класс Rest-сервиса с единственным методом, который будет возвращать список категорий:

package ru.datatech.testProject.services.rest;

import ru.datatech.testProject.domain.category.Category;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

@Path("/categories")
@Produces(MediaType.APPLICATION_JSON)
public class CategoriesRestService {
    @GET
    public Collection<Category> getCategories() {
        List<Category> categories = new ArrayList<Category>();
        Category root = new Category("root", "root");
        root.getChildren().add(new Category("1", "First"));
        root.getChildren().add(new Category("2", "Second"));
        categories.add(root);
        return categories;
    }
}

Здесь в аннотации @Path("/categories") мы указали, что при обращении по адресу /categories ответ будет сформирован rest-сервисом.

Аннотация @Produces(MediaType.APPLICATION_JSON) указывает, что результат должен быть представлен в формате json.

Аннотация @GET над методом говорит, что метод будет вызван при обращении к сервису с GET-запросом. Также над методом можно разместить аннотацию @Path("/some") , тогда для вызова метода необходимо будет обратиться с GET-запросом по адресу /categories/some , т.е. адрес сервиса + адрес метода.

Для того, чтобы зарегистрировать сервис в приложении и сделать его доступным создадим класс-наследник javax.ws.rs.ApplicationPath

import ru.datatech.testProject.services.rest.CategoriesRestService;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;

@ApplicationPath("services")
public class EducationProject extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(CategoriesRestService.class);
        return classes;
    }
}

В аннотации @ApplicationPath("services") мы указали, что префиксом для всех сервисов является services, то есть полный путь будет /services/categories. В переопределяемом методе getClasses()мы указали список классов, которые являются доступными rest-сервисами.

Необходимые зависимости получим через Apache Maven:

<?xml version="1.0" encoding="UTF-8"?>
<project ...>
    ...
    <dependencies>
        ...
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>
        ...
    </dependencies>
</project>

Для запуска приложение необходимо упаковать в jar- или war-архив и развернуть в JavaEE-контейнере.

При обращении с GET-запросом по адресу /services/categories/ получим результат в формате JSON:

/home/c/cn03523/wordpress 3/public html/wp content/uploads/2016/02/Снимок экрана 2016 02 01 в 22.01.06
Результат вызова REST-сервиса, ответ в формате Json