Нужно написать RESTful JSON сервис на Java - PullRequest
5 голосов
/ 01 октября 2011

Вот мое требование:

  1. У меня есть простая таблица в mysql (рассмотрим любую таблицу с несколькими полями)
  2. Мне нужно написать простой веб-сервис RESTFUL JSON на Javaкоторый выполняет операции CRUD над этой таблицей.

Я попытался найти в сети какой-то исчерпывающий пример этого, но не смог найти.Кто-нибудь может помочь?

Ответы [ 4 ]

8 голосов
/ 01 октября 2011

Джерси - это реализация JAX-RS для создания веб-сервисов RESTful.

Начните с их урока. Это довольно просто.

http://jersey.java.net/nonav/documentation/latest/getting-started.html

Редактировать: Кроме того, есть замечательная книга О'Рейли на эту тему (шокирующая, я знаю); RESTful Java с JAX-RS

2 голосов
/ 05 июня 2014

Я опишу основные части своего блога Создание веб-службы RESTful в Java , в которой показаны шаги, которые можно предпринять для подключения к базе данных и создания веб-службы RESTful с помощью следующего.

  • IDE: Eclipse IDE для разработчиков Jave EE (Kepler) поставляется со встроенной Maven
  • База данных: MySQL (также использует MySQL Workbench)
  • Сервер приложений: GlassFish 4.0
  • Java EE 7 (JAX-RS, JPA, JAXB и т. Д.)
  • Любой клиент REST для тестирования: (например, Почтальон)

Следующееописание предполагает, что вы уже установили технологию, указанную выше.Служба предназначена для таблицы базы данных 'item', в которой хранятся элементы с полями id, itemName, itemDescription, itemPrice .

Уровень сохраняемости

  • СоздатьСхема базы данных MySQL с помощью MySQL Workbench ' создает новую схему на подключенном сервере '.В этом примере схема называется smallbiz.
  • Подключите Eclipse к MySQL
    • Загрузите драйвер MySQL JDBC и сохраните его в удобном месте.
    • В Eclipse создайтеНовое Подключение к базе данных на вкладке Источник данных .Во время этого процесса вам нужно будет перейти к драйверу MySQL JDBC.
  • Создать пул и ресурс подключения MySQL JDBC в GlassFish (это необходимо для того, чтобы приложение могло подключиться к базе данныхпосле развертывания на сервере).
    • Скопируйте драйвер MySQL JDBC в каталог ext в GlassFish, т.е. $ glassfish_install_folder \ glassfish \ lib \ ext .Затем перезапустите GlassFish.
    • Войдите в административную область GlassFish с помощью браузера (по умолчанию расположенного в http://localhost:4848).
    • В разделе Ресурсы> JDBC> Пулы соединений , создайтеновый пул соединений с «Типом ресурса» java.sql.Driver.
    • На экране «Новый пул соединений JDBC (шаг 1 из 2)».
      • Введите «Имя пула» (например, SmallBizPool).
      • Выберите «Тип ресурса» (java.sql.Driver).
      • Выберите «Поставщик драйвера базы данных»(MySQL).
      • Далее .
    • В нижней части следующего экрана в Дополнительные свойства .
      • URL: jdbc: mysql: // localhost: 3306 / smallbiz
      • user: yourUser (root в моей настройке)
      • пароль: ваш пароль
      • Завершить
      • Пинг на следующем экране для проверки соединения.
    • Создание ресурса JDBC из пула соединений в Ресурсы> JDBC> Ресурсы JDBC :
      • Введите «Имя JNDI» (например, jdbc / SmallBiz),Мы используем это в файле persistence.xml, чтобы приложение знало, как подключиться к базе данных.
      • Выберите ранее созданный пул соединений из раскрывающегося списка «Имя пула».
    • Для получения дополнительной информации о пуле соединений JDBC и ресурсе
  • Подключите Eclipse к GlassFish.
    • Добавьте GlassFish Tools в Eclipse, выполнив поиск Справка> Eclipse Marketplace .
    • Подключите GlassFish к Eclipse, создав новый сервер с помощью вкладки Servers .
      • Выберите GlassFish 4.0 на экране Определить новый сервер .
      • Убедитесь, что я выбрал 'jdk7' и JDK в НовыйЭкран GlasssFish 4.0 Runtime .
      • На следующем экране убедитесь, что выбран правильный каталог домена (по умолчанию это domain1, например, $ glassfish_install_folder \ glassfish \ domains \ domain1 ), затем введите учетные данные администратора для GlassFish.
      • Теперь вы можете взаимодействовать со GlassFish (запускать, останавливать, перезапускать, запускать и т. Д.) В Eclipse.
  • Создайте новый проект Maven в Eclipse и добавьте зависимости, используя m2e (встроенный) для:
    • EclipseLink (для JPA) «org.eclipse.persistence eclipselink»

Для сопоставления с базой данных используется объект JPA. Объект JPA - это простой POJO (Простой старый Java-объект) с аннотациями JPA. Если база данных уже существует, Eclipse может сгенерировать сущность JPA из базы данных.

  • Создание таблицы базы данных с использованием SQL записки в Eclipse со следующим SQL

    CREATE TABLE item (
         id VARCHAR(36) NOT NULL,
         itemName TEXT NOT NULL,
         itemDescription TEXT,
         itemPrice DOUBLE,
         PRIMARY KEY (id)
     )
    
  • Создайте объект JPA из таблицы базы данных, щелкнув правой кнопкой мыши пакет, созданный в Eclipse, и выбрав Создать> Объекты JPA из таблицы .

  • Аннотируйте объект JPA с помощью аннотации JAXB, чтобы иметь возможность упорядочить его в xml или json и из него.

Поскольку в этом примере для первичного ключа используются UUID, существуют также аннотации (@UuidGenerator и @GeneratedValue), которые являются специфическими для EclipseLink для их создания. Нет необходимости использовать UUID в качестве первичных ключей, но одна из причин, по которым я его использую, заключается в том, что я могу создать модель на клиенте в комплекте с UUID, а затем ПОСТАВИТЬ эту новую модель на сервер (например, в автономном режиме, новый модели, созданные и сохраненные локально, передаются на сервер при возврате сигнала ячейки). Если сервер создал UUID, то новая модель отправляется на сервер без идентификатора с помощью POST.

package com.zangolie.smallbiz.entities;

import java.io.Serializable;

import javax.persistence.*;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.annotations.UuidGenerator;


/**
 * The persistent class for the item database table.
 * 
 */
@UuidGenerator(name="UUID")
@XmlRootElement
@Entity
@NamedQuery(name="Item.findAll", query="SELECT i FROM Item i")
public class Item implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(generator="UUID")
    @Column(length=36)
    private String id;

    private String itemDescription;

    @Lob
    private String itemName;

    private double itemPrice;

    public Item() {
    }

    public String getId() {
        return this.id;
    }

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

    public String getItemDescription() {
        return this.itemDescription;
    }

    public void setItemDescription(String itemDescription) {
        this.itemDescription = itemDescription;
    }

    public String getItemName() {
        return this.itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public double getItemPrice() {
        return this.itemPrice;
    }

    public void setItemPrice(double itemPrice) {
        this.itemPrice = itemPrice;
    }

}

Уровень обслуживания RESTful

  • Установите Maven Compiler на 1.7
    • Щелкните правой кнопкой мыши файл pom.xml и выберите Открыть с помощью> Редактор Maven POM . Добавьте следующее непосредственно перед закрывающим тегом.

фрагмент XML

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
  • Добавить зависимости, используя m2e для:
    • Сервлет 3.1 (JAX-RS 2.0 требует этого) "javax.servlet javax.servlet.api"
    • Джерси (для JAX-RS) "org.glassfish.jersey.core Джерси-Север"
    • EJB (требуется использовать аннотацию @Stateless) "javax.ejb javax.ejb.api"
  • Создайте POJO (обычный старый Java-объект) и аннотируйте его аннотациями JAX-RS для создания конечной точки.
    • @ Path ("/ your-app-api-uri") : чтобы указать путь относительно базового URI вашего сервера, на котором расположен ресурс
    • @ Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) : Созданное представление может быть json или xml.
    • @ Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) : используемое представление может быть json или xml
    • @ Stateless : Сервер не сохраняет состояние между взаимодействиями (это один из принципов архитектуры RESTful).
  • Аннотировать методы, которые сопоставляются с операциями CRUD.
    • @ POST : Создать
    • @ GET : Читать
    • @ PUT : обновление
    • @ УДАЛИТЬ : Удалить

Служба JAX-RS

package com.zangolie.smallbiz.services.rest;

import java.net.URI;
import java.util.Collection;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.ws.rs.BadRequestException;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import com.zangolie.smallbiz.entities.Item;

@Path("/item")
@Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Stateless
public class ItemRestService {
    //the PersistenceContext annotation is a shortcut that hides the fact
    //that, an entity manager is always obtained from an EntityManagerFactory.
    //The peristitence.xml file defines persistence units which is supplied by name
    //to the EntityManagerFactory, thus  dictating settings and classes used by the
    //entity manager
    @PersistenceContext(unitName = "testPU")
    private EntityManager em;

    //Inject UriInfo to build the uri used in the POST response
    @Context
    private UriInfo uriInfo;

    @POST
    public Response createItem(Item item){
        if(item == null){
            throw new BadRequestException();
        }
        em.persist(item);

        //Build a uri with the Item id appended to the absolute path
        //This is so the client gets the Item id and also has the path to the resource created
        URI itemUri = uriInfo.getAbsolutePathBuilder().path(item.getId()).build();

        //The created response will not have a body. The itemUri will be in the Header
        return Response.created(itemUri).build();
    }

    @GET
    @Path("{id}")
    public Response getItem(@PathParam("id") String id){
        Item item = em.find(Item.class, id);

        if(item == null){
            throw new NotFoundException();
        }

        return Response.ok(item).build();
    }

    //Response.ok() does not accept collections
    //But we return a collection and JAX-RS will generate header 200 OK and
    //will handle converting the collection to xml or json as the body
    @GET
    public Collection<Item> getItems(){
        TypedQuery<Item> query = em.createNamedQuery("Item.findAll", Item.class);
        return query.getResultList();
    }

    @PUT
    @Path("{id}")
    public Response updateItem(Item item, @PathParam("id") String id){
        if(id == null){
            throw new BadRequestException();
        }

        //Ideally we should check the id is a valid UUID. Not implementing for now
        item.setId(id);
        em.merge(item);

        return Response.ok().build();
    }

    @DELETE
    @Path("{id}")
    public Response deleteItem(@PathParam("id") String id){
        Item item = em.find(Item.class, id);
        if(item == null){
            throw new NotFoundException();
        }
        em.remove(item);
        return Response.noContent().build();
    }

}
  • Создать класс приложения, который определяет базовый URI. например, для http://localhost:8080/smallbiz/rest

    package com.zangolie.smallbiz.services.rest;
    
    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
    
    @ApplicationPath("rest")
    public class ApplicationConfig extends Application {
    
    }
    
  • Развертывание на GlassFish из Eclipse.

    • Щелкните правой кнопкой мыши проект Запуск от имени> Запуск на сервере
    • Выберите подключенный сервер GlassFish.
  • Тест с любым HTTP-клиентом (например, Postman, который работает в Chrome).

Хотя в примере используется GlassFish, любой контейнер, совместимый с Java EE 7, будет работать.Если вы используете другой контейнер (и при условии, что вы используете один и тот же EclipseLink для JPA и Jersey для реализаций JAX-RS), вам придется:

  • выяснить, как подключиться к нему из Eclipse.
  • Измените зависимости Maven для Jersey и EclipseLink с предоставленных для компиляции (поскольку они являются реализациями в GlassFish и могут отличаться в других контейнерах).

Надеюсь, что это полезно.

2 голосов
/ 01 октября 2011

Я бы взглянул на то, что предлагает весна.Есть RestTemplate и Spring MVC , оба из которых должны быть в состоянии помочь вам.

Еще одна вещь, которая будет полезна, это какая-тобиблиотеки JSON-Mapping.Я буду рекомендовать Jackson Object Mapper .Посмотрите на их учебники, чтобы понять, как это будет работать.

1 голос
/ 02 октября 2011

это может быть именно то, что вы ищете: http://restsql.org/doc/Overview.html

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я никогда не использовал его - просто вспомнил, что видел его недавно в новостной ленте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...