Метод || build() || должен создать || полный || экземпляр. Для всех необходимых полей должны быть установлены разумные значения по умолчанию, если пользователь не предоставил для них значения. POJO редко попадают в категорию классов, которые могут быть построены таким образом. Обычно POJO содержит большинство или все поля, необходимые для представления информации, которая просто не имеет разумных значений по умолчанию. Еще одно место, где часто используется Builder, – это такие вещи, как конфигурации сервера или клиента, и обычно Builder – это совершенно прекрасная статья, первоначально размещенная на моем личном веб-сайте в разделе BuildinTagged with java, playframework, api, rest. Образец… Статья, первоначально размещенная на моем личном веб-сайте в разделе Создание REST API в Play Framework g REST API в Play Framework. Создание REST API в Play Framework для такого рода приложений. Создание REST API в Play Framework . Образцы запросов также можно найти там
При создании веб-приложений REST стал наиболее широко используемым подходом, поскольку он прост в использовании и прост в реализации. В этом уроке я покажу, как создать простой REST API в Play Framework, и расскажу о 4 основных функциях:
- Создать – ОПУБЛИКОВАТЬ
- Обновить – ПОСТАВИТЬ
- Извлекать – получить
- Удалить – УДАЛИТЬ
Мы создадим простой API для программного обеспечения для управления учащимися, где мы сможем управлять учащимися и извлекать сохраненные данные. В этом не будет ничего особенного, просто введение в Play Framework и то, как можно создать REST API.
Настройка наших сущностей и базы данных
Во-первых, давайте создадим нашу базу данных. Мы сохраним имя студента, год обучения в университете и факультет, на котором он в настоящее время учится. Это простая структура всего с 4 столбцами (есть также идентификатор) и ничего больше.
Наш класс сущностей выглядит следующим образом. Наш класс сущностей выглядит следующим образом. Это свяжет таблицу базы данных с нашей моделью приложения и позволит нам легко сопоставлять данные из базы данных с классом Java и наоборот.
package data.domain; import javax.persistence.*; @Entity @Table(name = "students") public class StudentDO { @Id @Column @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; @Column private String name; @Column private Integer year; @Column private String department; }
Построение нашего DAO
Теперь, когда у нас есть Объект, нам нужно иметь возможность фактически хранить данные в базе данных и извлекать их при необходимости. Это делается с помощью JPA Api, и Play упрощает его использование. Мы создадим наш класс DAO, который предоставит необходимые методы для операций CRUD. Мы создадим наш класс DAO, который предоставит необходимые методы для операций CRUD. CRUD расшифровывается как Create, Read, Update и Delete, так что это методы, которые мы будем внедрять.
import com.google.inject.Inject; import data.domain.StudentDO; import play.db.jpa.JPAApi; import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import java.util.List; public class StudentDao { private static final String ENTITY_MANAGER_NAME = "default"; @Inject protected JPAApi jpaApi; public StudentDO create(StudentDO studentDO) { jpaApi.withTransaction(entityManager -> { entityManager.persist(studentDO); }); return studentDO; } public StudentDO find(Integer id) { return jpaApi.em(ENTITY_MANAGER_NAME).find(StudentDO.class, id); } public Listfind() { EntityManager entityManager = jpaApi.em(ENTITY_MANAGER_NAME); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(StudentDO.class); Root root = criteriaQuery.from(StudentDO.class); criteriaQuery.select(root); return entityManager.createQuery(criteriaQuery).getResultList(); } public void delete(int id) { jpaApi.withTransaction(entityManager -> { StudentDO studentDO = entityManager.find(StudentDO.class, id); if (studentDO != null) { entityManager.remove(studentDO); } }); } public StudentDO update(StudentDO studentDO) { jpaApi.withTransaction(entityManager -> {entityManager.merge(studentDO);}); return studentDO; } }
Мы создадим наш класс DAO, который предоставит необходимые методы для операций CRUD. CRUD расшифровывается как Create, Read, Update и Delete, так что это методы, которые мы будем внедрять. Мы также внедрили метод для извлечения всех сохраненных учащихся. увлекательно. Мы создадим наш класс DAO, который предоставит необходимые методы для операций CRUD. CRUD расшифровывается как Create, Read, Update и Delete, так что это методы, которые мы будем внедрять. Мы также внедрили метод для извлечения всех сохраненных учащихся. увлекательно. Более продвинутая система также предоставит параметры фильтрации, разбивку на страницы и другие функции, которые являются обязательными для продвинутого веб-приложения, но это будет сделано для нашего простого руководства по REST API.
Мы создадим наш класс DAO, который предоставит необходимые методы для операций CRUD. CRUD расшифровывается как Create, Read, Update и Delete, так что это методы, которые мы будем внедрять. Мы также внедрили метод для извлечения всех сохраненных учащихся. увлекательно. Более продвинутая система также предоставит параметры фильтрации, разбивку на страницы и другие функции, которые являются обязательными для продвинутого приложения weThe Service и transfer objects b, но это будет сделано для нашего простого руководства по REST API.
Мы создадим наш класс DAO, который предоставит необходимые методы для операций CRUD. CRUD расшифровывается как Create, Read, Update и Delete, так что это методы, которые мы будем внедрять. Мы также внедрили метод для извлечения всех сохраненных учащихся. увлекательно. Более продвинутая система также предоставит параметры фильтрации, разбивку на страницы и другие функции, которые являются обязательными для продвинутого приложения weThe Service и transfer objects b, но это будет сделано для ouThe контроллер не должен напрямую взаимодействовать с DAO. r простое руководство по REST API. Мы создадим наш класс DAO, который предоставит необходимые методы для операций CRUD. CRUD расшифровывается как Create, Read, Update и Delete, так что это методы, которые мы будем внедрять. Мы также внедрили метод для извлечения всех сохраненных учащихся. увлекательно. Более продвинутая система также предоставит параметры фильтрации, разбивку на страницы и другие функции, которые являются обязательными для продвинутого приложения weThe Service и transfer objects b, но это будет сделано для ouWe, у нас должно быть разделение функций, и каждый уровень имеет свою собственную роль. Контроллер не должен напрямую взаимодействовать с DAO. r простое руководство по REST API. Мы создадим наш класс DAO, который предоставит необходимые методы для операций CRUD. CRUD расшифровывается как Create, Read, Update и Delete, так что это методы, которые мы будем внедрять. Мы также внедрили метод для извлечения всех сохраненных учащихся. увлекательно. Более продвинутая система также предоставит параметры фильтрации, разбивку на страницы и другие функции, которые являются обязательными для продвинутого приложения weThe Service и transfer objects b, но это будет сделано для ouWe, у нас должно быть разделение функций, и у каждого уровня есть i. DAO взаимодействует с базой данных, у Сервиса есть бизнес-логика, а контроллер – это для внешнего доступа. собственная роль т. Контроллер не должен напрямую взаимодействовать с DAO. r простое руководство по REST API. Мы создадим наш класс DAO, который предоставит необходимые методы для операций CRUD. CRUD расшифровывается как Create, Read, Update и Delete, так что это методы, которые мы будем внедрять. Мы также внедрили метод для извлечения всех сохраненных учащихся. увлекательно. Более продвинутая система также предоставит параметры фильтрации, разбивку на страницы и другие функции, которые являются обязательными для продвинутого приложения weThe Service и transfer objects b, но это будет сделано для ouWe, у нас должно быть разделение функций, и у каждого уровня есть i DAO взаимодействует с базой данных, у сервиса есть tI, не буду вдаваться в подробности о эта тема, но я обычно структурирую свой код таким образом, и его легче поддерживать, когда вы знаете, кто за что отвечает. его бизнес-логика и контроллер предназначены для внешнего доступа. собственная роль т. Контроллер не должен напрямую взаимодействовать с DAO. r простое руководство по REST API.
Кроме того, для более продвинутых систем вы не должны возвращать непосредственно DO извне. Вместо этого у нас должно быть сопоставление между объектом домена и объектом передачи, используемым извне. Этот DTO (объект передачи данных) является внешним представлением, в то время как DO является внутренним. Для этой простой системы нет никаких различий (поэтому я не буду включать класс DTO), но у более сложных обычно есть, при этом DTO состоит из данных из нескольких DOS и с новыми полями, которые обрабатывают результаты.
Во-первых, давайте создадим служебный класс, который сопоставляет объекты Transfer и Domain. Ничего особенного, и если вы хотите, вы можете использовать BeanUtils для достижения этой цели.
import data.domain.StudentDO; import data.dto.StudentDTO; public class StudentMapper { public static StudentDTO toTransfer(StudentDO domain) { StudentDTO dto = new StudentDTO(); dto.setId(domain.getId()); dto.setName(domain.getName()); dto.setYear(domain.getYear()); dto.setDepartment(domain.getDepartment()); return dto; } public static StudentDO fromTransfer(StudentDTO dto) { StudentDO domain = new StudentDO(); domain.setId(dto.getId()); domain.setName(dto.getName()); domain.setYear(dto.getYear()); domain.setDepartment(dto.getDepartment()); return domain; } }
Далее, наш сервис, который обрабатывает всю бизнес-логику. Опять же, в этом простом примере нет ничего особенного. Мы получаем TO, сопоставляем его с DO, вызываем DAO и возвращаем результат.
import com.google.inject.Inject; import data.dao.StudentDao; import data.domain.StudentDO; import data.dto.StudentDTO; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; public class StudentService { @Inject private StudentDao studentDao; public ListgetAll() { List studentDOList = studentDao.find(); return studentDOList.stream().map(domain -> StudentMapper.toTransfer(domain)).collect(Collectors.toList()); } public Optional getById(int id) { StudentDO studentDO = studentDao.find(id); if (studentDO == null) { return Optional.empty(); } return Optional.of(StudentMapper.toTransfer(studentDO)); } public StudentDTO create(StudentDTO studentDTO) { StudentDO studentDO = StudentMapper.fromTransfer(studentDTO); studentDO = studentDao.create(studentDO); return StudentMapper.toTransfer(studentDO); } public Optional update(StudentDTO studentDTO, int id) { StudentDO fromDb = studentDao.find(id); if (fromDb == null) { return Optional.empty(); } fromDb.setName(studentDTO.getName()); fromDb.setYear(studentDTO.getYear()); fromDb.setDepartment(studentDTO.getDepartment()); fromDb = studentDao.update(fromDb); return Optional.of(StudentMapper.toTransfer(fromDb)); } public void delete(int id) { studentDao.delete(id); } }
Сопоставления контроллера и конечной точки
Контроллер является основной точкой входа, поэтому нам нужно получить информацию из HTTP-запроса, сопоставить ее с нашей внутренней структурой данных и вызвать службу для выполнения бизнес-логики. В случае, если что-то пойдет не так, мы вернем HTTP-статус, который правильно отражает то, что произошло. Я видел много сервисов, которые всегда возвращают 200, даже если произошла ошибка или ресурс не был найден, и предоставляют ошибку только в виде ответа JSON. Это неверно, и статус должен отражать фактическое состояние, а ответ JSON необходим только для получения дополнительной информации.
import com.fasterxml.jackson.databind.JsonNode; import com.google.inject.Inject; import data.dto.StudentDTO; import play.libs.Json; import play.mvc.Controller; import play.mvc.Http; import play.mvc.Result; import services.StudentService; import java.util.Optional; public class StudentsController extends Controller { @Inject private StudentService studentService; public Result get(Integer id) { Optionalstudent = studentService.getById(id); if (student.isPresent()) { return ok(Json.toJson(student.get())); } return notFound(); } public Result getAll() { return ok(Json.toJson(studentService.getAll())); } public Result create(Http.Request request) { JsonNode jsonData = request.body().asJson(); try { StudentDTO studentDTO = Json.fromJson(jsonData, StudentDTO.class); studentDTO = studentService.create(studentDTO); return ok(Json.toJson(studentDTO)); } catch (RuntimeException e) { // Most probably invalid student data return badRequest(request.body().asJson()); } } public Result update(Http.Request request, Integer id) { JsonNode jsonData = request.body().asJson(); try { StudentDTO studentDTO = Json.fromJson(jsonData, StudentDTO.class); Optional student = studentService.update(studentDTO, id); if (student.isPresent()) { return ok(Json.toJson(student.get())); } return notFound(); } catch (RuntimeException e) { return badRequest(request.body().asJson()); } } public Result delete(Integer id) { studentService.delete(id); return ok(); } }
А теперь мы сопоставляем наши конечные точки с методами контроллера.
GET /student controllers.StudentsController.getAll GET /student/:id controllers.StudentsController.get(id: Integer) + nocsrf POST /student controllers.StudentsController.create(request: Request) + nocsrf PUT /student/:id controllers.StudentsController.update(request: Request, id: Integer) + nocsrf DELETE /student/:id controllers.StudentsController.delete(id: Integer)
Некоторые объяснения
Первое, что вы можете заметить, это то, что DAO использует jpa Api.withTransction(). Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. В противном случае мы не сможем внести какие-либо изменения и получим сообщение об ошибке: java.lang. Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. В противном случае мы не сможем внести какие-либо изменения и получим сообщение об ошибке: java.lanIllegalArgumentException: Удаление отдельного экземпляра. g.
Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. В противном случае мы не сможем внести какие-либо изменения и получим сообщение об ошибке: java.lanIllegalArgumentException: Удаление отсоединенного экземпляра. например, во-вторых, тот факт, что контроллер ловит исключение RuntimeException. Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. В противном случае мы не сможем внести какие-либо изменения и получим сообщение об ошибке: java.lanIllegalArgumentException: Удаление отсоединенного экземпляра. например, Во-вторых, тот факт, что это связано с тем, что анализатор JSON может выдать это, когда предоставлен недопустимый JSON. контроллер e улавливает исключение RuntimeException. Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. В противном случае мы не сможем внести какие-либо изменения и получим сообщение об ошибке: java.lanIllegalArgumentException: Удаление отсоединенного экземпляра. например, Во-вторых, тот факт, что это связано с тем, что анализатор JSON может выдать это, когда invalidwe вернет BadRequest() с предоставленными входными данными. предоставляется идентификатор JSON. контроллер e улавливает исключение RuntimeException. Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. В противном случае мы не сможем внести какие-либо изменения и получим сообщение об ошибке: java.lanIllegalArgumentException: Удаление отсоединенного экземпляра. например, Во-вторых, тот факт, что это связано с тем, что анализатор JSON может выдавать это, когда invalidwe вернет BadRequest() с предоставленной inpA более продвинутой системой, может определите, что не так, и предоставьте более четкое сообщение. Предоставляется ut. id JSON. контроллер e улавливает исключение RuntimeException.
Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. В противном случае мы не сможем внести какие-либо изменения и получим сообщение об ошибке: java.lanIllegalArgumentException: Удаление отсоединенного экземпляра. например, Во-вторых, тот факт, что это связано с тем, что анализатор JSON может выдавать это, когда invalidwe вернет BadRequest() с предоставленной inpA более продвинутой системой, может определите, что не так, и подтвердите, но не в последнюю очередь, + nocsrf в файле маршрутизации. ide более четкое сообщение. ut. предоставляется идентификатор JSON. контроллер e улавливает исключение RuntimeException. Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. В противном случае мы не сможем внести какие-либо изменения и получим сообщение об ошибке: java.lanIllegalArgumentException: Удаление отсоединенного экземпляра. например, Во-вторых, тот факт, что это связано с тем, что анализатор JSON может выдавать это, когда invalidwe вернет BadRequest() с предоставленной inpA более продвинутой системой, может определите, что не так, и подтвердите это, чтобы разрешить запрос, даже если не предоставлен токен CSRF. И последнее, но не менее важное: + nocsrf в файле маршрутизации. идея предоставляется более явное сообщение. ut. id JSON. контроллер e улавливает исключение RuntimeException. Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. В противном случае мы не сможем внести какие-либо изменения и получим сообщение об ошибке: java.lanIllegalArgumentException: Удаление отсоединенного экземпляра. например, Во-вторых, тот факт, что это связано с тем, что анализатор JSON может выдавать это, когда invalidwe вернет BadRequest() с предоставленной inpA более продвинутой системой, может определите, что не так, и подтвердите это, чтобы разрешить запрос, даже если не предоставлен токен CSRF. Обычно мы этого не разрешаем, но поскольку это служба RESTful, которая не привязана к HTML, мы это разрешаем. ast, но не в последнюю очередь, + nocsrf в файле маршрутизации. идея предоставляется более явное сообщение. ut. id JSON. контроллер e улавливает исключение RuntimeException. Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. В противном случае мы не сможем внести какие-либо изменения и получим сообщение об ошибке: java.lanIllegalArgumentException: Удаление отсоединенного экземпляра. например, Во-вторых, тот факт, что это связано с тем, что анализатор JSON может выдавать это, когда invalidwe вернет BadRequest() с предоставленной inpA более продвинутой системой, может определите, что не так, и подтвердите это, чтобы разрешить запрос, даже если не предоставлен токен CSRF. Обычно мы этого не разрешаем, но поскольку это RESTful-сервис для готовой к работе службы, нам действительно нужно добавить способ аутентификации и авторизации запросов, но это обсуждение для другой статьи. ce, который не привязан к HTML, мы разрешаем это. ast, но не в последнюю очередь, + nocsrf в файле маршрутизации. идея предоставляется более явное сообщение. ut. id JSON. контроллер e улавливает исключение RuntimeException.
Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. В противном случае мы не сможем внести какие-либо изменения и получим сообщение об ошибке: java.lanIllegalArgumentException: Удаление отсоединенного экземпляра. например, Во-вторых, тот факт, что это связано с тем, что анализатор JSON может выдавать это, когда invalidwe вернет BadRequest() с предоставленной inpA более продвинутой системой, может определите, что не так, и подтвердите это, чтобы разрешить запрос, даже если не предоставлен токен CSRF. Обычно мы этого не разрешаем, но поскольку это RESTful-сервис для готовой к работе службы, нам нужно добавить статью о способе, первоначально размещенную на моем личном веб-сайте в разделе f аутентификация и авторизация запросов, но это обсуждение для другой статьи. ce, который не привязан к HTML, мы разрешаем это. ast, но не в последнюю очередь, + nocsrf в файле маршрутизации. идея предоставляется более явное сообщение. ut. id JSON. контроллер e улавливает исключение RuntimeException. Первое, что вы можете заметить, это то, что DAO использует jpa Api.with Transaction(). Это делается для того, чтобы гарантировать наличие транзакции при выполнении любой операции записи в базу данных. В противном случае мы не сможем внести какие-либо изменения и получим сообщение об ошибке: java.lanIllegalArgumentException: Удаление отсоединенного экземпляра. например, Во-вторых, тот факт, что это связано с тем, что анализатор JSON может выдавать это, когда invalidwe вернет BadRequest() с предоставленной inpA более продвинутой системой, может определите, что не так, и подтвердите это, чтобы разрешить запрос, даже если не предоставлен токен CSRF. Обычно мы этого не разрешаем, но поскольку это RESTful-сервис для готовой к работе службы, нам нужно добавить способ создания REST API в статье Play Framework, первоначально размещенной на моем личном веб-сайте в разделе f аутентификация и авторизация запросов, но это обсуждение для другой статьи. ce, который не привязан к HTML, мы разрешаем это. ast, но не в последнюю очередь, + nocsrf в файле маршрутизации. идея предоставляется более явное сообщение. ut. id JSON. контроллер e улавливает исключение RuntimeException. . Образцы запросов также можно найти там
Оригинал: “https://dev.to/pazvanti/building-a-rest-api-in-play-framework-3agh”