Я опишу основные части своего блога Создание веб-службы 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 и могут отличаться в других контейнерах).
Надеюсь, что это полезно.