Spring АйО
8.43K subscribers
303 photos
209 videos
402 links
Русскоязычное сообщество Spring-разработчиков.

Habr: bit.ly/433IK46
YouTube: bit.ly/4h3Ci0x
VK: bit.ly/4hF0OG8
Rutube: bit.ly/4b4UeX6
Яндекс Музыка: bit.ly/3EIizWy

Канал для общения: @spring_aio_chat
Download Telegram
🗓 Еженедельный дайджест №14

Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!

Эффективное управление окружениями с Docker Composeрассказали про не всем известный способ настройки окружения с использованием extends и include

Java 23 - Launch StreamOracle в прямом эфире представил Java 23 и все её нововведения

Подчини паузы своей воле с Generational ZGCузнали от команды Netflix о неожиданных и ожидаемых преимуществах Generational ZGC

JPA Entity Graph и нюансы его использованияпогрузились в технологию гибкого переключения между стратегиями загрузки данных

Какой технологией пользуетесь для взаимодействия с базой данных в продакшн-среде?провели опрос среди участников сообщества, который вызвал не мало обсуждений в комментариях

😌 @spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍7🔥6
⭐️ Haulmont – партнёр Spring АйО

Друзья, хотим поделиться с вами важной новостью. Сообщество Spring АйО активно начало свою деятельность в начале лета, и, за этот, казалось бы, небольшой промежуток времени, мы успели сделать многое:

– Опубликовано 34 статьи на Хабре
– Общее количество постов в нашем канале превысило 200
– Сообщество насчитывает более 3 000 участников

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

Мы стремимся быть максимально прозрачными с вами и хотим отметить, что для производства качественного контента и поддержки команды необходимы финансовые ресурсы. Вы могли заметить, что в нашем сообществе отсутствует прямая реклама. Вместо этого мы выбрали путь сотрудничества с крупными технологическими компаниями на взаимовыгодных условиях.

В ближайшее время мы объявим всех партнёров сообщества, благодаря которым возможна стабильная работа команды Spring АйО. Вместо рекламы мы будем время от времени публиковать партнёрские посты, которые будут отмечены эмодзи – ⭐️.

–––

Встречайте нашего первого партнёра – компанию Haulmont. Haulmont – российская компания, специализирующаяся на разработке корпоративного программного обеспечения для коммерческого сектора и государственных структур. Для нас, как для Spring-разработчиков, Haulmont интересен таким продуктом, как Amplicode. Отметим, что команда Amplicode активно помогает нам в создании материалов и приглашает нас принимать участие в своих мероприятиях, за что им отдельное спасибо!

Благодаря поддержке наших партнёров, мы сможем продолжать развивать сообщество и создавать для вас качественный контент 💚
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍53🔥1211👎4
🪲 Взлом JVM-приложения с помощью отладчика IntelliJ IDEA

Что если мы скажем вам, что отладчик может стать не просто инструментом для поиска ошибок, а настоящим "режимом бога" в мире кода?

В новом переводе от команды Spring АйО рассматривается, как можно исследовать память приложения и изменить его функциональность, при этом не затрагивая исходного кода, а используя только лишь отладчик IntelliJ IDEA.

📚Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/845554/
🔥36👍94🤩1
Hibernate 7.0 уже близко!

Один из разработчиков Hibernate поделился некоторыми инсайдами касаемо того, над чем он сейчас работает и какие нововведения стоит ожидать в следующей мажорной версии:

Hibernate ORM 7.0 — следующий большой шаг после революции, начатой ORM 6. Я только что завершил поддержку функций JSON и XML.

Сейчас занимаюсь разработкой функций для преобразования массивов в строки с возвращением результата в виде таблиц или наборов значений.

Следующий этап — использовать всё это в нашей реализации составных агрегатов. Независимо от того, как вы храните данные, Hibernate позволит вам моделировать и запрашивать их одинаково через HQL/Criteria. Я верю, что это изменит игру для тех, кто заботится о производительности запросов. Иерархическое хранение данных не только избавляет от JOIN (что всегда приятно), но и позволяет на некоторых базах данных создавать индексы на такие сложные столбцы! Такой подход может значительно повысить скорость поиска, например, при поиске товаров с множеством фильтров по атрибутам, таким как бренд, цвет и т.д. А в базах данных вроде PostgreSQL вы можете достичь индексного или даже только индексного сканирования для ваших запросов 🔥

Однако учтите, что такой дизайн таблиц не идеален для записи, так как отсутствуют внешние ключи, дублируются данные и т.д. — по сути, это денормализация. Чтобы получить лучшее из обоих миров, необходимо разделить модели чтения и записи.

Как только я завершу реализацию этих функций в Hibernate ORM, я покажу вам, как справиться с денормализацией 😀


Делитесь своим мнением касаемо грядущего обновления в комментариях!
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍35👎7🔥63🤔1👌1
#ВопросЭксперту: Spring Data R2DBC. Что не так с реактивными ORM?

В новом посте из цикла "#ВопросЭксперту" Михаил Поливаха – эксперт сообщества Spring АйО, ответил на мучающий многих вопрос и рассказал про нюансы Spring Data R2DBC.

–––

Работать с RDBMS в реактивных приложениях бывает сложно, и на то есть реальные причины. Тут совершенно неважно, написаны эти приложения с использованием RXJava или Project Reactor, есть некоторые проблемы на стыке концепций. Но надо понимать, что иногда с этим добром приходится работать, поэтому предлагаю взглянуть на пример ниже (полный код можно увидеть в моем playground репо на GitHub'е):


@Table("orders")
public class Order {

@Id
@EqualsAndHashCode.Include
private Long id;
private String status;
@MappedCollection(keyColumn = "order_id", idColumn = "order_id")
private List<OrderItem> orderItems;
}

@Table("order_item")
public class OrderItem {

@Id
@EqualsAndHashCode.Include
private Long id;
private String name;
private double price;
}

public interface OrderRepository extends ReactiveCrudRepository<Order, Long> { }

// INSERT INTO orders(id, "status") VALUES(1, 'NEW');
// INSERT INTO order_item("name", "order_id") VALUES('Lego', 1);
class OrderRepositoryTest extends AbstractPostgreSQLIntegrationTest {
@Test
void testR2dbcAggregateLoading() {
StepVerifier
.create(orderRepository.findById(1L))
.expectNextMatches(order -> {
System.out.println(order);
return order.getOrderItems().size() == 2 && order.getStatus().equals("NEW");
})
.expectComplete()
.verify();
}
}


А теперь ответьте на вопрос: "Пройдет ли тест успешно?". Я специально сделал пример довольно простым, убрал какие-то доп. компоненты/настройки.

На самом деле проблема в том, что у нас не подгрузилось One-To-Many отношение. Казалось бы, в концепцию DDD оно нормально ложится, и в Spring Data JDBC оно работает нормально. В таком случае вопрос: "Что пошло не так и почему?". Наверное, многим будет интересно узнать, что же случилось?

Ответ я разобью на пункты:

1. Это не баг, поддержки любого рода relation'ов в Spring Data R2DBC сейчас нет.
2. Конкретно в текущем случае, который мы рассматриваем, сделать поддержку relation'ов можно.
3. Почему поддержки relation'ов нет сейчас? TL;DR: потому что отсутствует нормальный способ реализовать поддержку relation'ов в общем случае(!) для Aggregates с учетом парадигмы реактивного программирования.

Хочу заметить, что, в целом, реализовать поддержку relation'ов можно, но будут свои нюансы и вытекающие проблемы. Поскольку эта тема очень большая, детали того, почему же так, что делать, и какие планы работы с этим, я поясню на своем докладе на Joker.
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍28🔥92👌1
⚠️ Критическая уязвимость с оценкой CVSS 9.9 обнаружена в системах GNU/Linux

Недавно была обнаружена критическая уязвимость, угрожающая всем системам GNU/Linux, которая позволяет выполнять код удаленно без аутентификации. Проблема затронула такие компании, как Canonical и Red Hat, и получила оценку 9.9 из 10 по шкале CVSS, что подтверждает её серьёзность. Пока патч не выпущен, разработчики и пользователи находятся в состоянии неопределенности, опасаясь возможных последствий.

В новом переводе от команды Spring АйО приводятся подробности о сроках раскрытия деталей уязвимости и предлагаются временные меры для защиты систем.

📚Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/846498/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥62
🤣 Если бы программисты строили дома #old_but_gold

Иногда кажется, что события многолетней давности произошли буквально вчера. Но за это время, на самом деле, много чего произошло — например, выросло новое поколение разработчиков! Почему мы об этом говорим? Есть материалы, которым уже много лет, но они не теряют актуальности. Некоторые из нас выросли на них, а другие, возможно, никогда о них не слышали.

Мы решили время от времени публиковать такие материалы. Одни смогут поностальгировать, другие — понять, что некоторые проблемы остаются неизменными. Такие посты мы будем отмечать хэштегом #old_but_gold.

–––

И первым таким материалом мы выбрали занимательный рассказ, опубликованный в 2001 году о том, что было бы, если бы программисты строили дома 😂

Обсуждали проект. Сидоров предлагает крупноблочную архитектуру. Петрович настаивает, что все надо строить по старинке, из кирпича, не по-ламерски. Самый радикальный проект предложил Алекс: построить несколько десятков деревянных коттеджей и потом соединить их подземными туннелями. На Западе сейчас так модно. Напомнили ему, что заказчик требует именно 12-этажный дом. Пытались решить вопрос дуэлью в Quаkе. Алекса с его коттеджами завалили сразу, но между Петровичем и Сидоровым вышла ничья. В итоге каждый будет строить по своему плану, а потом попытаемся все это соединить, чтоб не рухнуло.


📚 Читать целиком на Хакер.ру: https://xakep.ru/2001/06/19/12860/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18😁13🔥3
🗓 Еженедельный дайджест №15

Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!

Взлом JVM-приложения с помощью отладчика IntelliJ IDEAизменили функциональность приложения, при этом не притронулись к исходному коду

Hibernate 7.0 уже близко!поделились новостью про грядущее обновление Hibernate

#ВопросЭксперту: Spring Data R2DBC. Что не так с реактивными ORM?посмотрели на интересный кейс из реактивного стека от эксперта сообщества

Критическая уязвимость с оценкой CVSS 9.9 обнаружена в системах GNU/Linuxне оставили без внимания недавно обнаруженную проблему в GNU/Linux, а также способы ее обхода

Если бы программисты строили дома #old_but_goldпоностальгировали и посмеялись с рассказа с аналогией между строителями и программистами

😌 @spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥31
📏 Почему нет достойных форматтеров кода для Java?

Форматирование кода в Java всегда было темой обсуждения среди разработчиков. Многочисленные инструменты предлагают свои решения, но ни один из них не кажется идеальным. Так, возникает вопрос: есть ли форматтер, который действительно отвечает всем нашим требованиям?

В новом переводе от команды Spring АйО рассмотрены популярные инструменты, их плюсы и минусы, а также рассуждения на тему: может ли Java-экосистема предложить достойный форматтер?

📚Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/846278/
🔥20👍96👎2
🔧 Целостность данных при использовании JSON-колонок в базе данных

Всё чаще можно заметить хранение данных в формате JSON в реляционных базах данных. Использование JSON позволяет упростить структуру таблиц, заменяя сложные отношения между ними. Однако такое упрощение может привести к неожиданным проблемам с целостностью данных.

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

В MySQL валидировать содержимое JSON-колонок можно прямо "из коробки", а для PostgreSQL есть специальное расширение. Ниже рассмотрим пример использования этого расширения.

Представьте, что у вас есть таблица products с колонкой attributes, где вы храните дополнительные характеристики продукта в формате JSON.


CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
attributes JSON NOT NULL DEFAULT '{}'
);


Мы ожидаем, что поле tags внутри этого JSON будет массивом строк. Однако без строгой проверки на уровне базы данных нет гарантии, что кто-то не запишет туда числа, объекты или вообще что-то неподходящее.

Чтобы сохранить гибкость JSON и одновременно обеспечить строгую структуру данных, можно использовать валидацию JSON-схемы на уровне базы данных. Для этого нужно добавить constraint, который автоматически проверит соответствие содержимого JSON определенной схеме при каждой операции вставки или обновления.

Пример для PostgreSQL:

ALTER TABLE products ADD CONSTRAINT data_is_valid CHECK(
validate_json_schema(
'{
"type": "object",
"properties": {
"tags": {
"type": "array",
"items": { "type": "string" }
}
},
"additionalProperties": false
}',
attributes
)
);


Теперь, попытка вставить данные с невалидным значение для tags приведёт к ошибке:

INSERT INTO products (..., attributes) VALUES
(..., '{}'), -- Пустой объект, допускается
(..., '{"tags": []}'), -- Пустой массив строк
(..., '{"tags": ["test"]}'); -- Массив со строкой
-- Результат: Операция успешна

INSERT INTO products (..., attributes) VALUES
(..., '{"tags": [2]}'); -- Массив с числом вместо строки
-- Ошибка: Нарушен constraint


#DatabaseTip #SQL #JSONSchema
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41🔥74
⚡️ Стала известна дата релиза Spring Framework 7.0!

Команда Spring АйО перевела письмо Юргена Хёллера Spring-сообществу.

Тезисно:

☝️ Первый Spring Framework 7.0 milestone ожидается в начале 2025 года
✍️ Spring Boot 3.5 будет базироваться на Spring Framework 6.2.x.
🆕 Spring Boot 4.0 будет основан на Spring Framework 7.0 GA

📚 Прочитать письмо Юргена целиком можно на Хабре: https://habr.com/ru/companies/spring_aio/news/847460/
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24👍15🤩4
🧠 AI-ассистент со Spring AI (Часть 1)

В новом переводе от команды Spring АйО показан процесс интеграции AI в немалоизвестное приложение Spring Petclinic.

В статье автор пошагово делится своим опытом внедрения Spring AI, чтобы сделать приложение более интерактивным.

📚Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/848016/
🔥18👍84
🪲 JUnit 4 и JUnit 5 – как избежать ошибок?

Довольно распространённой ошибкой при тестировании приложений на Java, приводящей к неожиданным результатам тестов, является совместное использование JUnit 4 и JUnit 5 в одном и том же тестовом классе.

Не смотря на то, что первая версия JUnit 5 вышла в 2017 году, до сих пор существуют проекты, которые используют его предшественника — и это вполне нормально.

JUnit 5 поддерживает запуск тестов JUnit 4 вместе с тестами JUnit 5 благодаря JUnit Vintage Engine. Благодаря этой фиче мы можем постепенно мигрировать с JUnit 4 на JUnit 5.

Именно JUnit Vintage Engine делает возможным выполнение тестов, написанных на JUnit 4, в среде JUnit 5. Однако использование аннотаций и API JUnit 4 и JUnit 5 (точнее, JUnit Jupiter) одновременно в одном тестовом классе не работает. Нам нужно выбирать что-то одно.

Мы можем использовать как тесты JUnit 4, так и тесты JUnit 5 в одном проекте, но каждый отдельный тестовый класс должен использовать либо JUnit 4, либо JUnit 5.

Например, тест MyOrderTest может быть написан на JUnit 4, а MyPricingServiceTest — на JUnit 5, и это абсолютно нормально.

✍️ Хорошая статья про миграцию с JUnit 4 на JUnit 5 в блоге Oracle (en): https://blogs.oracle.com/javamagazine/post/migrating-from-junit-4-to-junit-5-important-differences-and-benefits
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥75
🗓 Еженедельный дайджест №16

Для тех, кто был слишком занят на неделе или просто пропустил некоторые посты, публикуем дайджест!

Почему нет достойных форматтеров кода для Java? – выяснили, какие есть инструменты для форматирования java-кода, а также узнали, какие у них преимущества и недостатки

Целостность данных при использовании JSON-колонок в базе данных – разрабрались с тем, как задавать ограничения для JSON-колонок на уровне базы данных

Стала известна дата релиза Spring Framework 7.0 – сообщили о ближайшем релизе Spring Framework 6.2, а также узнали, когда стоит ждать седьмую версию нашего любимого фреймворка

AI-ассистент со Spring AI (Часть 1) – узнали, как можно использовать Spring AI в существующем приложении благодаря очень подробному step-by-step туториалу

JUnit 4 и JUnit 5 – как избежать ошибок? – разобрали одну из самых частых проблем, с которой можно столкнуться при миграции с одной версии JUnit на другую

😌 @spring_aio
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥32
😀 Spring АйО х Joker

Друзья, с радостью сообщаем о том, что команда Spring АйО примет участие в ближайшей конференции JUG Ru Group – Joker 2024.

Мы станем партнёрами лаунж-зоны, где вы сможете пообщаться с нашими экспертами, задать интересующие вас вопросы и обсудить новости из мира Spring'а в неформальной обстановке.

Приходите, будем рады видеть каждого из вас 💚
Please open Telegram to view this post
VIEW IN TELEGRAM
👍33🔥157
✍️ Туториал по Spring Data Envers для начинающих

Команда Spring АйО перевела статью, которая отлично подойдёт тем, кто ещё не знаком со Spring Data Envers. В статье на простых примерах объясняется, как отслеживать изменения данных в приложении, используя этот инструмент.

📚 Подробнее читайте на Хабре: https://habr.com/ru/companies/spring_aio/articles/849086/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥621
#анонсы

Бесплатные доклады для всех в Community Day

Joker 2024 стартует 9 октября в онлайне. В этот день часть докладов любой сможет посмотреть бесплатно — достаточно зарегистрироваться.

Мы называем это Community Day. Так мы делимся частью конференции со всеми желающими: новые участники смогут оценить формат и контент, а те, кто давно не участвовал в Joker, — освежить воспоминания и вновь почувствовать себя частью сообщества.

Что входит в программу Community Day:

→ Александр Белов — Jimmer ORM. Сравнение с JPA
→ Вадим Бубликов — Разрабатываем модульный бэкенд, используя стандартные возможности Spring Boot
→ Андрей Чухлебов — GraalVM Native Image: как правильно подойти к переходу на Native на примере тонкого клиента Ignite
→ Феликс Десятириков — Java с правильной ориентацией: DOP
→ Обсуждение «Java 23. Горячие JEP'ы»

Все эти выступления — для вас! Зарегистрируйтесь до 9 октября включительно и подключайтесь.
🤩103🔥3
🆕 Вышел Spring AI 1.0.0 M3

Spring выпустил Spring AI 1.0.0 M3, который принес множество значительных улучшений и новых возможностей в разработку AI-приложений.

В новом переводе от команды Spring АйО рассказывается про улучшения, связанные с observability, совершенствование системы advisor`ов и оптимизацию работы с функциями и embedding моделями.

📚 Читать на Хабр: https://habr.com/ru/companies/spring_aio/articles/849752/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥64
⭐️ Лучший способ создания нескольких окружений для Spring Boot приложения

Недавно мы вкратце рассказывали, какие есть способы управления окружением с использованием Docker Compose.

В новой статье от команды Amplicode более подробно рассказывается про каждый из способов, их преимущества и недостатки, а также поддержку со стороны инструментов разработки.

📚 Читать на Хабре: https://habr.com/ru/companies/haulmont/articles/848696/
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍22🔥87