Перейти до основного вмісту

Публікації

Показано дописи з міткою "SpringBoot"

DatabaseClient в WebFlux

DatabaseClient у Spring WebFlux DatabaseClient — це низькорівневий реактивний API для роботи з реляційними базами даних у Spring WebFlux. Він входить до складу Spring Data R2DBC та дозволяє виконувати SQL-запити без використання блокуючого JDBC. Якщо JdbcTemplate є стандартним рішенням для Spring MVC, то DatabaseClient виконує аналогічну роль у реактивному стеку. Він надає простий спосіб виконання SQL-запитів, прив'язки параметрів та перетворення результатів у Java-об'єкти. DatabaseClient працює поверх драйвера R2DBC і повертає реактивні типи Mono<T> та Flux<T> , що дозволяє повністю зберігати неблокуючу модель виконання. DatabaseClient добре підходить у таких випадках: необхідно виконувати власні SQL-запити; потрібен повний контроль над SQL; проєкт використовує Spring WebFlux та R2DBC; запити занадто складні для похідних методів Repository; необхідно отримувати лише окремі поля, а не цілі сутності; потрібно виконувати JOIN, агрегатні функції або...

Складний ключ в Spring Data JPA

Spring Data JPA дозволяє зручно працювати з ORM: для кожної таблиці досить просто створити entity-клас із відповідними полями. Поле певинного ключа позначається антацієї @Id . Але інколи доводиться працювати з таблицями, у яких є лише складений ключ. В такому випадку можна використати кілька підходів. Вбудований клас Нехай у нас є таблиця зі складеним клчем по полях product_id та language_id . Тоді нам потрібно створити допоміжний Embeddable-клас: @Embeddable public class ProductLanguageId implements Serializable { @Column(name = "product_id") private Long productId; @Column(name = "language_id") private Long languageId; // constructors public ProductLanguageId() {} public ProductLanguageId(Long productId, Long languageId) { this.productId = productId; this.languageId = languageId; } // getters/setters @Override public boolean equals(Object o) { ... } @Override public int hashCode() { ....

Запуск Java-проєкту з вказаною JDK через maven

Інколи виникає потреба запустити java-проєкт з використанням іншої JDK/JRE, ніж встановлена по замовчуванню і налаштована в Maven. Якщо це разовий запуск (або інша дія), то змінювати налаштування може зайняти більше часу, ніж хотілося б. В такому випадку можна використати, наприклад, наступні команди (для JDK 17). Всі приклади - для операційної системи Ubuntu. Замість mvn clean install JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH mvn clean install Запуск Spring Boot-проєкту: JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 PATH=/usr/lib/jvm/java-17-openjdk-amd64/bin:$PATH mvn spring-boot:run -Dspring-boot.run.profiles=local Як подивитися, які версії JDK встановлені, описано тут . Варто зауважити, що важливою є не лише дефолтна версія JDK, а й налаштування Maven. Подивитися поточне значення JAVA_HOME можна командою: echo $JAVA_HOME Змінити налаштування: nano ~/.bashrc Потрібно додати/змінити рядки на зразок: M2_HOME="/...

Шпаргалка по запуску та збірці Spring Boot-проєктів

Maven + Spring Boot 1. Збірка проєкту (із завантаженням залежностей, компіляцією, запуском тестів та створенням артефакту) mvn clean install 2. Збірка артефакту без встановлення у локальний репозиторій mvn package 3. Збірка без тестів mvn clean package -DskipTests 4. Запуск Spring Boot-проєкту mvn spring-boot:run 5. Запуск із активним профілем Spring Boot mvn spring-boot:run -Dspring-boot.run.profiles=dev 6. Запуск із параметрами mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8081 --spring.profiles.active=prod" 7. Запуск з jar-файлу java -jar target/your-app-name.jar 8. Запуск тестів mvn test 9. Запуск, якщо pom.xml у підкаталозі mvn -f шлях/до/pom.xml spring-boot:run 10. Запуск із Maven-профілем (не плутати з Spring Boot профілем) mvn clean install -P dev Gradle + Spring Boot 1. Збірка проєкту (з компіляцією, тестами та створенням jar) ...

Агрегати в DDD

Domain-Driven Design (DDD, предметно-орієнтоване проєктування) — це підхід до розробки програмного забезпечення, який зосереджується на моделюванні бізнес-логіки на основі реального домену (предметної області). Його запропонував Ерік Еванс у своїй книзі "Domain-Driven Design: Tackling Complexity in the Heart of Software". Основні принципи DDD Фокус на домені – головна увага приділяється предметній області, а не технічним деталям. Єдина мова (Ubiquitous Language) – розробники, бізнес-аналітики та інші учасники проєкту використовують спільну термінологію, щоб уникнути непорозумінь. Бізнес-логіка відокремлена від технічної реалізації – код моделюється так, щоб він чітко відображав реальний бізнес-процес. Основні концепції DDD Entity (Сутність) – об’єкт з унікальним ідентифікатором, що зберігається в системі (наприклад, Користувач, Замовлення). Value Object (Об’єкт-значення) – об’єкт, який не має унікального ідентифікатора та є незмінним (наприклад, Адреса або Гроші)...

Робота SpringBoot 3 з базою даних Redis

Redis Redis (Remote Dictionary Server) — це in-memory база даних ключ-значення з відкритим вихідним кодом, що використовується для зберігання структурованих даних. Вона підтримує різні типи даних, такі як рядки, списки, множини, упорядковані множини з діапазонами, хеші, бітові масиви, потоки і т. д. Redis широко використовується для кешування, управління сесіями, систем обміну повідомленнями, черг задач та інших сценаріїв, що вимагають високої продуктивності і низької затримки. Redis з SpringBoot Розглянемо простий проєкт на SpringBoot, що використовує Redis, як базу даних. Створимо такий проєкт: Створимо entity Cat: import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.redis.core.RedisHash; @Data @RedisHash("cat") public class Cat { @Id private String id; private String name; private Integer age; public Cat(String name, Integer age) { this.name = name; this.age = age; } } Звер...

Spring Boot Actuator

Actuator в Spring Boot - це бібліотека, яке надає різноманітну інформацію про стан вашого застосунку і його компонентів. Він дозволяє легко моніторити застосунок в режимі реального часу. Основні можливості actuator включають: Стан застосунку (/actuator/health): Цей ендпоінт повертає інформацію про стан застосунку. Це може бути корисно для моніторингу системи та виявлення будь-яких проблем. Інформація про стан містить загальну інформацію про стан. Інформація про середовище (/actuator/env): Цей ендпоінт надає доступ до інформації про середовище, в якому працює ваш застосунок. Ви можете отримати доступ до системних властивостей, змінних середовища, налаштувань ініціалізації та іншої важливої інформації. Метрики (/actuator/metrics): Цей ендпоінт надає статистику про різні показники застосунку, такі як кількість HTTP-запитів, використання пам'яті, кількість з'єднань з базою даних, час відповіді тощо. Ви можете використовувати ці метрики для аналізу продуктивності вашог...

Проблема при запуску Liquibase на Digital Ocean та її вирішення

Нещодавно зустрівся з такою проблемою: SpringBoot-проєкт не запустився на сервері через проблему пов’язану з Liquibase. Детальніше про проєкт Сам проєкт повністю написаний на SpringBoot, база даних на MySQL, міграція здійснюється за допомогою Liquibase. Проєкт відносно невеликий і локально запускався і працював без проблем. Але при запуску на продакт-сервері отримувалася помилка: ERROR org.springframework.boot.SpringApplication [main] Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Invocation of init method failed; nested exception is liquibase.exception.DatabaseException: Unable to create or change a table without a primary key, when the system variable 'sql_require_primary_key' is set. Add a primary key to the table or unset this variable to avoid this me...