Spring Boot: Используй ResponseEntity<T>, чтобы получить тонкий контроль над HTTP-ответом.
Можно явно задать status, headers и body.
👉 Java Portal
Можно явно задать status, headers и body.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Вопрос для интервью по Spring Boot:
Когда ты делаешь REST API в Spring Boot, часто используют префикс
Но добавлять
Есть ли способ проще, чтобы не писать это на каждом контроллере?
Да: можно задать единый префикс через конфигурацию.
Так ты автоматически добавляешь
👉 Java Portal
Когда ты делаешь REST API в Spring Boot, часто используют префикс
/api для всех контроллеров.Но добавлять
@RequestMapping("/api") в каждый контроллер неудобно и захламляет код.Есть ли способ проще, чтобы не писать это на каждом контроллере?
Да: можно задать единый префикс через конфигурацию.
@Configuration
class WebMvcConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.addPathPrefix("/api",
aClass -> aClass.getPackage().getName()
.startsWith("com.sivalabs.bookstore"));
}
}
Так ты автоматически добавляешь
/api ко всем контроллерам из нужного пакета, а код контроллеров остается чистым.Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
Тестируете JBoss или другие Java application servers? 🧐
JexBoss это Python-инструмент для проверки серверов JBoss на известные уязвимости, включая проблемы с Java deserialization в ряде фреймворков (JSF, Seam, Jenkins, Struts2 и др.). Есть режим автопроверки сетей (скан диапазонов CIDR) для инвентаризации и поиска потенциально уязвимых узлов.
https://github.com/joaomatosf/jexboss
👉 Java Portal
JexBoss это Python-инструмент для проверки серверов JBoss на известные уязвимости, включая проблемы с Java deserialization в ряде фреймворков (JSF, Seam, Jenkins, Struts2 и др.). Есть режим автопроверки сетей (скан диапазонов CIDR) для инвентаризации и поиска потенциально уязвимых узлов.
https://github.com/joaomatosf/jexboss
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
Какой будет результат выполнения кода?
→
→
→
→
→ Ошибка компиляции
Примечание: по умолчанию при сериализации/десериализации Jackson опирается на спецификацию JavaBeans, то есть учитываются только методы getter и setter.
👉 Java Portal
→
{"name":"Laptop"}→
{"name":"Laptop","price":50000}→
{"price":50000}→
{}→ Ошибка компиляции
Примечание: по умолчанию при сериализации/десериализации Jackson опирается на спецификацию JavaBeans, то есть учитываются только методы getter и setter.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Продвинутый Map в Java (надо знать)
Если ты хоть раз делал
Признайся, все когда-то писали так:
Или вообще вот так:
==> В Apache Commons Collections уже давно есть готовая штука:
Что это такое
Никаких
Что умеет
- Добавление без боли:
- Массовые операции:
- Проверка существования конкретной пары:
- Удаление конкретного значения у ключа:
- Получить вообще все значения:
Реализации
-
-
👉 Java Portal
Если ты хоть раз делал
Map<String, List<String>>, этот пост для тебя.Признайся, все когда-то писали так:
Map<String, List<String>> userTags = new HashMap<>();
userTags.computeIfAbsent("user123", k -> new ArrayList<>()).add("premium");
userTags.computeIfAbsent("user123", k -> new ArrayList<>()).add("verified");
Или вообще вот так:
if (!userTags.containsKey("user123")) {
userTags.put("user123", new ArrayList<>());
}
userTags.get("user123").add("premium");==> В Apache Commons Collections уже давно есть готовая штука:
MultiValuedMap.Что это такое
MultiValuedMap<K, V> это структура данных, которая позволяет хранить несколько значений на один ключ. По сути это Map<K, Collection<V>>, но с нормальным, удобным API.MultiValuedMap<String, String> userTags = new ArrayListValuedHashMap<>();
userTags.put("user123", "premium");
userTags.put("user123", "verified");
userTags.put("user123", "early-adopter");
// Забрать все теги сразу
Collection<String> tags = userTags.get("user123");
// [premium, verified, early-adopter]
Никаких
computeIfAbsent, никаких проверок на null. Просто работает.Что умеет
- Добавление без боли:
multiMap.put("key", "value1");
multiMap.put("key", "value2"); // не затирает предыдущее значение- Массовые операции:
multiMap.putAll("user456", Arrays.asList("admin", "moderator"));- Проверка существования конкретной пары:
multiMap.containsMapping("user123", "premium"); // true/false- Удаление конкретного значения у ключа:
multiMap.removeMapping("user123", "premium");- Получить вообще все значения:
Collection<String> allTags = multiMap.values();
// все значения со всех ключей
Реализации
-
ArrayListValuedHashMap<K, V> — значения хранятся в ArrayList, порядок сохраняется, дубликаты возможны-
HashSetValuedHashMap<K, V> — значения хранятся в HashSet, без дублейPlease open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥5👀5👍3🤔1
Знания по базам данных на техсобесах игнорировать нельзя.
Честно, многие реально боятся DB. И когда бэкендер не может сходу написать обычный, часто используемый запрос, его шансы пройти начинают заметно проседать.
Один из ключевых концептов тут это JOIN.
Я собрал понятную шпаргалку по SQL JOIN: с примерами и визуализацией, чтобы быстро уложить в голове.
👉 Java Portal
Честно, многие реально боятся DB. И когда бэкендер не может сходу написать обычный, часто используемый запрос, его шансы пройти начинают заметно проседать.
Один из ключевых концептов тут это JOIN.
Я собрал понятную шпаргалку по SQL JOIN: с примерами и визуализацией, чтобы быстро уложить в голове.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍3💊1
Брейкпоинты в IDEA (IntelliJ и другие) для разработчиков
Иногда смотрю, как люди дебажат, и чуть ли не ловлю инсульт🍺
Большинство разработчиков умеют только ставить и удалять брейкпоинты. А в IDEA есть куча полезных фич для отладки. Ниже самые годные:
[1] Условие остановки
Если метод вызывается часто или брейкпоинт стоит в цикле, не трать время, ожидая нужных значений:
▪️ ПКМ по брейкпоинту
▪️ В Condition добавь условие остановки. Можно использовать все доступные переменные, объекты и методы
[2] Динамически смотреть значения параметров
Вариант для новичков: добавить в код
Вариант для продвинутых:
▪️ Зажми Shift и поставь брейкпоинт
▪️ Отметь чекбокс Evaluate and log
▪️ Введи нужное выражение
Дебаггер не будет останавливать выполнение, но будет писать значение выражения в консоль. Супер полезно для многопоточки, кода сторонних библиотек и remote debugging.
[3] Отключение брейкпоинта
Ненужный брейкпоинт можно не удалять, а просто выключить:
▪️ Нажми на шестеренку у брейкпоинта
ИЛИ
▪️ ПКМ по брейкпоинту → снимай галочку Enabled
[4] Массовая чистка
Когда в проекте много брейкпоинтов, IDE может чуть тормозить во время дебага. Чтобы убрать лишние, открой полный список:
▪️ ПКМ по любому брейкпоинту
▪️ Link More
▪️ Слева будет список брейкпоинтов
▪️ Удаляй ненужные
Обязательно попробуй. Пусть дебаг будет как по маслу👍
👉 Java Portal
Иногда смотрю, как люди дебажат, и чуть ли не ловлю инсульт
Большинство разработчиков умеют только ставить и удалять брейкпоинты. А в IDEA есть куча полезных фич для отладки. Ниже самые годные:
[1] Условие остановки
Если метод вызывается часто или брейкпоинт стоит в цикле, не трать время, ожидая нужных значений:
[2] Динамически смотреть значения параметров
Вариант для новичков: добавить в код
System.out.println с нужным полем/выражением.Вариант для продвинутых:
Дебаггер не будет останавливать выполнение, но будет писать значение выражения в консоль. Супер полезно для многопоточки, кода сторонних библиотек и remote debugging.
[3] Отключение брейкпоинта
Ненужный брейкпоинт можно не удалять, а просто выключить:
ИЛИ
[4] Массовая чистка
Когда в проекте много брейкпоинтов, IDE может чуть тормозить во время дебага. Чтобы убрать лишние, открой полный список:
Обязательно попробуй. Пусть дебаг будет как по маслу
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥8
Java 25: апгрейд, который экономит до 30% RAM (без правок кода)
В JDK 25 добавили одну из самых заметных оптимизаций за долгое время: Compact Object Headers (JEP 519).
Что меняется:
- размер заголовка объекта уменьшается примерно с ~12 байт до 8 байт
- меньше памяти на объект -> меньше heap
- меньше heap -> меньше давление на GC
- меньше GC -> сервис быстрее + облако дешевле
Где профит максимальный:
Spring Boot, микросервисы, DTO, records, кэши, в общем всё, где много мелких объектов.
Включается одной опцией:
-XX:+UseCompactObjectHeaders
По отзывам из реальных систем:
снижение heap на 15–30% встречается довольно часто.
Просто протестируй на своих сервисах и забирай “бесплатную” экономию.
👉 Java Portal
В JDK 25 добавили одну из самых заметных оптимизаций за долгое время: Compact Object Headers (JEP 519).
Что меняется:
- размер заголовка объекта уменьшается примерно с ~12 байт до 8 байт
- меньше памяти на объект -> меньше heap
- меньше heap -> меньше давление на GC
- меньше GC -> сервис быстрее + облако дешевле
Где профит максимальный:
Spring Boot, микросервисы, DTO, records, кэши, в общем всё, где много мелких объектов.
Включается одной опцией:
-XX:+UseCompactObjectHeaders
По отзывам из реальных систем:
снижение heap на 15–30% встречается довольно часто.
Просто протестируй на своих сервисах и забирай “бесплатную” экономию.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Java: Records не ограничены ролью просто контейнера данных, в них можно добавлять кастомные конструкторы и методы для валидации.
✅ В records можно иметь конструкторы, статические методы и методы экземпляра:
👉 Java Portal
public record Email(String address) {
// Конструктор с валидацией
public Email {
if (address == null || !address.matches("^[\\w-.]+@([\\w-]+\\.)+[\\w-]{2,4}$")) {
throw new IllegalArgumentException("Некорректный email-адрес: " + address);
}
}
// Метод экземпляра
public String domain() {
return address.substring(address.indexOf('@') + 1);
}
// Статический метод
public static Email from(String raw) {
return new Email(raw.trim().toLowerCase());
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
5👍5❤1
В Spring Boot можно включить асинхронное логирование, настроив Logback (logback-spring.xml).
✅ Лог-сообщения отправляются в очередь и обрабатываются отдельным фоновым потоком.
✅ Это снижает узкие места на I/O (ввод-вывод).
Положи конфиг Logback в папку
Пример:
👉 Java Portal
Положи конфиг Logback в папку
resources:src/main/resources/logback-spring.xmlПример:
<configuration>
<!-- Консольный appender, обернутый в async -->
<appender name="ASYNC_CONSOLE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="CONSOLE" />
<queueSize>5000</queueSize>
<discardingThreshold>0</discardingThreshold>
<includeCallerData>false</includeCallerData>
</appender>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="ASYNC_CONSOLE" />
</root>
</configuration>
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2