Сделаем простой 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: