В течение многих лет мы написали на Java много шаблонного кода, такого как методы getter, setter, equals, hashCode и т.д.. В некоторых случаях это вызывает проблемы с точки зрения чистого и читаемого кода.
В таких ситуациях Project Lombok спасает нас. Кроме того, с помощью Lombok вы сможете уделять больше времени бизнес-логике.
В этом руководстве я расскажу вам о Project Lombok и приведу пример использования Spring Boot.
-
Здесь используются проекты Spring Boot и Spring Data для разработки REST API.
-
Maven используется для автоматизации процесса сборки.
-
Используется типичный подход к разработке на основе предметной области (domain-driven), разделяющий классы модели, репозитория, сервиса и контроллера.
Вы можете скачать исходный код проекта по этой ссылке на GitHub
Что такое Project Lombok?
Я скопировал описание проекта Ломбок отсюда (Официальный сайт). Я не мог бы придумать лучшего предложения, чтобы объяснить это :). «Project Lombok — это java-библиотека, которая автоматически подключается к вашему редактору и инструментам сборки, делая вашу java более пикантной».
«Никогда больше не пишите еще один метод getter или equals, с одной аннотацией ваш класс получает полнофункциональный конструктор, автоматизируется создание переменных журналирования и многое другое».
Project Lombok использует аннотации, чтобы избежать написания шаблонного кода. В некоторых случаях всего пять строк кода могут заменить сотни строк.
Как вы видите ниже, вместо почти восьмидесяти строк кода было использовано несколько аннотаций.
Класс Book, созданный с использование Lombok
package com.medium.libraryinfosystem.model.lombok; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; /** * @author ragcrix */ @Data @AllArgsConstructor @NoArgsConstructor @Entity @Table public class Book { @Id @GeneratedValue private Long id; private String writer; private String name; private String genre; private String year; }
Описание используемых аннотаций согласно Lombok JavaDoc :
-
@Data
: «Создает методы getter для всех полей, метод toString и реализации hashCode и equals, которые проверяют * все не transient поля. Также будет генерировать конструктор, а также методы setter для всех не final полей». -
@AllArgsConstructor
: «Создает конструктор со всеми аргументами». -
@NoArgsConstructor
: «Создает конструктор без аргументов». -
@Slf4j
: «Заставляет ломбок генерировать поле logger.»
Ниже Вы можете увидеть класс модели Book, которая также создана без использования Lombok.
Класс Book, созданный с использование стандартного кода
package com.medium.libraryinfosystem.model.classic; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import java.util.Objects; /** * @author ragcrix */ @Entity @Table public class Book { @Id @GeneratedValue private Long id; private String writer; private String name; private String genre; private String year; public Book() { } public Book(Long id, String writer, String name, String genre, String year) { this.id = id; this.writer = writer; this.name = name; this.genre = genre; this.year = year; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getWriter() { return writer; } public void setWriter(String writer) { this.writer = writer; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGenre() { return genre; } public void setGenre(String genre) { this.genre = genre; } public String getYear() { return year; } public void setYear(String year) { this.year = year; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Book book = (Book) o; return Objects.equals(id, book.id) && Objects.equals(writer, book.writer) && Objects.equals(name, book.name) && Objects.equals(genre, book.genre) && Objects.equals(year, book.year); } @Override public int hashCode() { return Objects.hash(id, writer, name, genre, year); } @Override public String toString() { return "Book{" + "id=" + id + ", writer='" + writer + '\'' + ", name='" + name + '\'' + ", genre='" + genre + '\'' + ", year='" + year + '\'' + '}'; } }
Project Lombok также обеспечивает удобство ведения журнала следующим образом. Например, вы можете использовать @Slf4j
аннотацию для ведения журнала.
Аннотация @ Slf4j используется для ведения журнала
package com.medium.libraryinfosystem.service.impl; import com.medium.libraryinfosystem.model.lombok.Book; import com.medium.libraryinfosystem.repository.BookRepository; import com.medium.libraryinfosystem.service.BookService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * @author ragcrix */ @Slf4j @Service public class BookServiceImpl implements BookService { @Autowired private BookRepository bookRepository; @Override public Book findByName(String name) { log.info("inside findByName()"); return bookRepository.findByName(name); } @Override public List<Book> findAll() { log.info("inside findAll()"); return bookRepository.findAll(); } @Override public Book save(Book book) { log.info("inside save()"); return bookRepository.save(book); } @Override public void delete(Book book) { log.info("inside delete()"); bookRepository.delete(book); } }
Как установить Lombok
Мы можем легко интегрировать Lombok в нашу IDE (IntelliJ, Eclipse и т.д.).
В этом разделе я расскажу вам об установке Lombok для IntelliJ Idea. Вы можете перейти сюда, чтобы увидеть другие варианты установки.
-
Во-первых, вы должны выбрать Lombok при инициализации проекта Spring Boot, как показано ниже.
2. После этого, если вы не добавили плагин Lombok в свою IDE раньше, IntelliJ задаст вам вопрос. Вы должны выбрать плагин Lombok и нажать кнопку ОК, чтобы установить плагин в вашу среду IDE.
Вы можете убедиться, что Lombok установлен в вашей среде IDE, как показано ниже. Как только установка Lombok будет завершена, мы готовы к работе.
Информационная система библиотеки
В этом руководстве для кодирования, сборки и тестирования REST API используются IntelliJ IDEA , Maven и Postman . Я работаю в Windows 10 с помощью PowerShell.
Все программное обеспечение написано на Java, с использованием Spring 5.2 и Spring Boot 2.2.2, база данных H2 в памяти используется для сохранения данных.
Далее я предполагаю, что у вас установлены JDK 13.0, IntelliJ, Maven и Postman.
Информационная система библиотеки предоставляет информацию о книгах и позволяет добавлять новые книги в систему или удалять книги из системы.
Моя цель здесь — показать, как использовать Lombok простым способом без перетасовки бизнес-логики.
-
Операция POST используется для добавления книг в систему.
-
Таблица book в базе данных H2 в памяти содержит данные о названии каждой книги, авторе, жанре и году.
-
Все, что хранится, получается и возвращается службой, форматируется как JSON.
Модель Book
Эта модель имеет 5 полей: id, name, writer, genre и year.
package com.medium.libraryinfosystem.model.lombok; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; /** * @author ragcrix */ @Data @AllArgsConstructor @NoArgsConstructor @Entity @Table public class Book { @Id @GeneratedValue private Long id; private String writer; private String name; private String genre; private String year; }
Все использованные аннотации Lombok объяснены выше.
Репозиторий Book
Вы можете легко создать интерфейс, расширяющий CrudRepository, с помощью Spring Data Project. При этом нет необходимости реализовывать этот интерфейс :).
package com.medium.libraryinfosystem.repository; import com.medium.libraryinfosystem.model.lombok.Book; import org.springframework.data.repository.CrudRepository; import java.util.List; /** * @author ragcrix */ public interface BookRepository extends CrudRepository<Book, Long> { Book findByName(String name); List<Book> findAll(); Book save(Book book); void delete(Book book); }
В BookRepository есть четыре метода. Это простые операции CRUD (создание, чтение, обновление, удаление) .
Сервис Book
Сервис Book имеет четыре метода. Просто эти методы выдают список книг по некоторым критериям, сохраняют или обновляют данные о книге и удаляют книгу.
package com.medium.libraryinfosystem.service; import com.medium.libraryinfosystem.model.lombok.Book; import java.util.List; /** * @author ragcrix */ public interface BookService { Book findByName(String name); List<Book> findAll(); Book save(Book book); void delete(Book book); }
Вы можете увидеть реализацию этого интерфейса ниже.
package com.medium.libraryinfosystem.service.impl; import com.medium.libraryinfosystem.model.lombok.Book; import com.medium.libraryinfosystem.repository.BookRepository; import com.medium.libraryinfosystem.service.BookService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * @author ragcrix */ @Service public class BookServiceImpl implements BookService { @Autowired private BookRepository bookRepository; @Override public Book findByName(String name) { return bookRepository.findByName(name); } @Override public List<Book> findAll() { return bookRepository.findAll(); } @Override public Book save(Book book) { return bookRepository.save(book); } @Override public void delete(Book book) { bookRepository.delete(book); } }
Book контроллер
BookController.java — это класс REST контроллера, который имеет два метода с аннотацией @GetMapping
, один с @PostMapping
и один с @DeleteMapping
.
package com.medium.libraryinfosystem.controller; import com.medium.libraryinfosystem.dto.BookDTO; import com.medium.libraryinfosystem.model.lombok.Book; import com.medium.libraryinfosystem.service.BookService; import com.medium.libraryinfosystem.util.ObjectMapperUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; /** * @ragcrix */ @RestController @RequestMapping("/books") public class BookController { @Autowired private BookService bookService; @GetMapping(value = "/") public List<BookDTO> getAllBooks() { return ObjectMapperUtils.mapAll(bookService.findAll(), BookDTO.class); } @GetMapping(value = "/byName/{bookName}") public BookDTO getBookByName(@PathVariable("bookName") String bookName) { return ObjectMapperUtils.map(bookService.findByName(bookName), BookDTO.class); } @PostMapping(value = "/save") public ResponseEntity<?> saveOrUpdateBook(@RequestBody BookDTO bookDTO) { bookService.save(ObjectMapperUtils.map(bookDTO, Book.class)); return new ResponseEntity("Book added successfully", HttpStatus.OK); } @DeleteMapping(value = "/delete/{bookName}") public ResponseEntity<?> deleteBookByName(@PathVariable String bookName) { bookService.delete(bookService.findByName(bookName)); return new ResponseEntity("Book deleted successfully", HttpStatus.OK); } }
Конфигурация базы данных
Чтобы подключиться к базе данных H2, отредактируйте настройки в файле «application.properties», который расположен в директори resources. Достаточно следующей конфигурации.
# Server server.port=9090 # Enabling H2 Console spring.h2.console.enabled=true # Datasource spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password= # JPA spring.jpa.show-sql=true spring.jpa.generate-ddl=true spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
После запуска информационной системы библиотеки вы можете легко получить доступ к базе данных H2 по этой ссылке .
Примечание. Каждый раз, когда запускается этот проект, будут выполняться скрипт в файле data.sql, который находится в директории resources. Конечно, для этого используется Spring Data.
insert into book values(1, 'SCI-FI', 'Frankenstein', 'Mary Shelley', '1818'); insert into book values(2, 'Fantastic', 'Harry Potter', 'J. K. Rowling', '1997');
Запуск службы и тестирование с помощью Postman
Вы можете легко запустить этот проект для тестирования службы REST.
Если вы хотите добавить книгу в информационную систему библиотеки, вы можете использовать файл data.json в корне проекта.
После запуска проекта вы можете протестировать службу REST. Для этого откройте Postman, введите URL-адрес и выберите метод GET, как показано ниже.
Снова введите ссылку с названием книги в базу данных.
Вы можете добавить книгу в систему с помощью метода POST в Postman. Сначала вы должны ввести пару ключ-значение заголовка Content-Type:application/json . Во-вторых, во вкладке body вы должны ввести информацию о книге, которую вы хотите сохранить в базе данных в формате JSON.
Если вы хотите удалить книгу, вам следует выбрать метод DELETE в Postman и добавить название книги, которую вы хотите удалить, в конец ссылки.
Ресурсы
Примечание. В этом руководстве рассматривается сочетание Spring Data, H2 в памяти и REST API. В проекте нет проверки для полей объекта.
Спасибо за прочтение! Ваши мысли очень ценны для меня. Пожалуйста, поделитесь.
ссылка на оригинал статьи https://habr.com/ru/post/523876/