Рубрики
Без рубрики

Как структурировать ваши Java-приложения с помощью JHipster

7 лет назад состоялся первый релиз JHipster. Это позволило разработчикам генерировать код для современного Интернета… С тегами hipster, java, springboot, микросервисы.

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

Эта статья была первоначально опубликована по адресу: Эта статья была первоначально опубликована по адресу:

Знакомство с хипстером

Проще говоря, Hipster – это генератор кода, который может очень быстро помочь вам начать создавать приложения. Но простота хипстера заканчивается на этом предложении. Он может быть использован для создания самых современных приложений в соответствии с передовыми моделями и технологиями. Тот факт, что они позволяют так легко начать работу, является их главным преимуществом. Самое приятное то, что все это с открытым исходным кодом. Буква “J” в JHipster означает Java и предназначена для приложений Java. Сегодня мы рассмотрим некоторые из основных компонентов приложения Java Spring Boot, созданного для вас JHipster.

RESTful API с использованием Spring Web

Spring Boot упрощает реализацию сложных концепций с помощью аннотаций. Это одно из самых больших преимуществ Spring Boot, заключающееся в том, что большая часть конфигурации скрыта от пользователя, и для этого требуется самоуверенный подход к тому, какой минимум должен быть для запуска приложения. Ниже приведен пример запроса GET для активации конкретного пользователя из репозитория JHipster.

@GetMapping("/activate")
public void activateAccount(@RequestParam(value = "key") String key) {
    Optional user = userService.activateRegistration(key);
    if (!user.isPresent()) {
        throw new AccountResourceException("No user was found for this activation key");
    }
}

Просмотр UserController.java в контексте на Этот ИИ

Строка 1: Аннотация @GetMapping отмечает метод, который будет выполняться при вводе точного URL-адреса из браузера или какого-либо инструмента, такого как Postman. В нем говорится, что это запрос на получение, а путь – “/activate”. Предположим, вы запускаете приложение на своем локальном хосте на порту 8080, URL-адрес будет localhost:8080/activate.

Строка 2: В этой строке отображается имя метода и аргументы, которые он принимает. Здесь у нас есть еще одна аннотация, называемая @RequestParam, со значением ‘key’. Это говорит о том, что запрос будет иметь параметр в URL-адресе, называемый key, с соответствующим значением. URL-адрес будет выглядеть следующим образом:.

Строка 3-5: Следующие три строки реализуют логику активации пользователя. Мы вызываем метод activate в пользовательской службе, передавая ключ, который мы получили в качестве параметра запроса. Он возвращает необязательное значение User, и это проверяется, чтобы определить, активирован пользователь или нет.

Объекты базы данных и выполнение запросов

Репозитории используются для запроса к базе данных, и в этом примере мы рассмотрим UserRepository и несколько связанных с ним методов. Но перед этим нам нужно понять, из чего состоит пользовательская сущность.

@Entity
@Table(name = "jhi_user")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class User extends AbstractAuditingEntity implements Serializable {


    private static final long serialVersionUID = 1L;


    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator")
    @SequenceGenerator(name = "sequenceGenerator")
    private Long id;


    @NotNull
    @Pattern(regexp = Constants.LOGIN_REGEX)
    @Size(min = 1, max = 50)
    @Column(length = 50, unique = true, nullable = false)
    private String login;


    @JsonIgnore
    @NotNull
    @Size(min = 60, max = 60)
    @Column(name = "password_hash", length = 60, nullable = false)
    private String password;

Просмотр User.java в контексте на/| Этот ИИ

Строка 1-3: Аннотация @Entity помечает этот класс как объект базы данных, а аннотация @Table указывает, что он представляет таблицу с именем ‘jhi_user’. Аннотация @Cache используется для обозначения того, что этот объект будет частью кэша, а стратегия, используемая для кэширования, – NONSTRICT_READ_WRITE. Это используется для объектов, которые обновляются реже, а также там, где две транзакции будут пытаться обновить один и тот же элемент.

Строка 5-53: Это различные поля, присутствующие внутри таблицы пользователя. Здесь есть довольно много аннотаций, которые нужно понять. Аннотация @id сообщает нам, что это первичный ключ таблицы. Он имеет сгенерированное значение, что означает, что нам не нужно явно устанавливать его, что делается с помощью генератора последовательностей. Аннотация @Column отображает различные столбцы таблицы. @Size задает максимальный размер, тогда как @notnull означает, что он не может быть нулевым.

Далее мы выполним запрос к базе данных с использованием Spring Data JPA. Spring использует аннотацию @Repository для абстрагирования большого количества шаблонного кода, который ранее требовался для выполнения запросов к базе данных. Приведенный ниже пример предназначен для выполнения запроса для возврата одного пользователя с определенным ключом активации. Помните REST API, который мы рассматривали ранее, который проверял, активирован пользователь или нет? Этот запрос выполняется как часть этой операции.

@Repository
public interface UserRepository extends JpaRepository {
    Optional findOneByActivationKey(String activationKey);  
 }

Просмотр UserRepository.java в контексте на/| Этот ИИ

Строка 1-2: Первая строка означает, что следующий интерфейс является репозиторием. Мы расширяем JpaRepository с помощью имени класса сущности и типа его первичного ключа, который является длинным. Это дает нам доступ ко множеству предопределенных методов, которые выполняют запросы за кулисами.

Строка 3: Запрос, который мы хотим выполнить здесь, состоит в том, чтобы найти одного пользователя из этой таблицы с определенным ключом активации. В традиционном SQL это было бы SELECT * FROM USER WHERE. Но с Spring Data JPA мы можем записать его как ключ активации findOneBy(строка activationKey). Как это работает? Помните, когда мы определяли столбцы, мы указали ключ активации в виде строки. Это позволяет Spring Data JPA включить этот метод для нас. При вызове этого метода с ключом в качестве аргумента он вернет объект пользователя, если они существуют, в противном случае null.

Тестирование с использованием JUnit 5

Если вы разработчик Java, вы должны быть знакомы с тестированием JUnit. С JUnit 5 они внесли несколько хороших дополнений, чтобы упростить тестирование вашего кода. Новым дополнением является аннотация @beforeEach, которую вы можете увидеть в действии ниже.

@BeforeEach
public void initTest() {
    user = initTestUser(userRepository, em);
}

Просмотр UserTest.java в контексте на Этот ИИ

Строка 1-3: Первая строка отмечает следующий метод, который необходимо выполнить перед каждым тестовым примером. Метод unit Test() вызывает другой метод init Test User() в тестовом файле, передавая объект репозитория и объект entity manager. Затем это используется для создания макетного объекта для пользователя для всех тестовых случаев.

Еще одним замечательным новым дополнением являются лямбда-функции в тестовых примерах. Ниже приведен пример использования лямбда-функций в наших тестовых примерах. Не беспокойтесь о логике, присутствующей здесь. Он просто получает размер базы данных перед удалением пользователя, выполняет операцию удаления и проверяет, уменьшился ли размер на 1.

@Test
@Transactional
void deleteUser() throws Exception {
    // Initialize the database
    userRepository.saveAndFlush(user);
    int databaseSizeBeforeDelete = userRepository.findAll().size();


    // Delete the user
    restUserMockMvc
        .perform(delete("/api/admin/users/{login}", user.getLogin()).accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isNoContent());


    assertThat(cacheManager.getCache(UserRepository.USERS_BY_LOGIN_CACHE).get(user.getLogin())).isNull();


    // Validate the database is empty
    assertPersistedUsers(users -> assertThat(users).hasSize(databaseSizeBeforeDelete - 1));
}

Просмотр DeleteUserTest.java в контексте на/| Этот ИИ

Строка 1-2: Означает, что это тестовый пример. @Transactional указывает, что следующий метод будет выполнять транзакцию базы данных, и он должен будет удовлетворять определенным правилам, таким как запрещение обновлений, если они отменяются между ними, и обеспечение стабильности состояния базы данных до и после операции.

Строка 5-6: Здесь мы инициализируем базу данных, а затем получаем количество пользователей, присутствующих в базе данных. Это сохраняется в переменной Размера базы данных перед удалением.

Строка 9-12: Затем мы выполняем операцию удаления для пользователя, который принимает ввод JSON, и ожидаемый статус – нет содержимого.

Строка 13-16: Здесь мы проверяем две вещи. Один из них заключается в том, что мы утверждаем, что пользователь отсутствует в кэше. Во-вторых, мы утверждаем, что размер базы данных уменьшился на 1. Если вы видите строку 16, вы также можете увидеть использование лямбда-функции для выполнения того же самого, что ранее было невозможно с JUnit.

Вывод

Мы надеемся, что этот пост дал вам представление о Hipster и некоторых концепциях, лежащих в основе создания приложения Spring Boot. Не останавливайтесь на достигнутом, репозиторий содержит гораздо больше, чем вы можете изучить и использовать для развития своего приложения.

Quod AI – это поиск кода и навигация на стероидах. Мы превращаем репозитории git в документацию, которую на самом деле используют разработчики. Пожалуйста, следите за нами в Twitter @quod_ai для получения обновлений о нашем продукте и контенте сообщества разработчиков. Проверьте наше приложение по адресу: beta.quod.ai .

Оригинал: “https://dev.to/quod_ai/how-to-structure-your-java-apps-using-jhipster-5gpp”