Библиотека джависта | Java, Spring, Maven, Hibernate

Логотип телеграм канала @javaproglib — Библиотека джависта | Java, Spring, Maven, Hibernate Б
Актуальные темы из канала:
Memes
Tutorial
Event
Почитать
Гайд
Дайджест
Soft
Javadevjob
Proglib
Bust
All tags
Логотип телеграм канала @javaproglib — Библиотека джависта | Java, Spring, Maven, Hibernate
Актуальные темы из канала:
Memes
Tutorial
Event
Почитать
Гайд
Дайджест
Soft
Javadevjob
Proglib
Bust
All tags
Адрес канала: @javaproglib
Категории: Технологии
Язык: Русский
Количество подписчиков: 23.11K
Описание канала:

Все самое полезное для Java-разработчика в одном канале.
Список наших каналов: https://t.me/proglibrary/9197
Для обратной связи: @proglibrary_feeedback_bot
По рекламе: @proglib_adv
РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4

Рейтинги и Отзывы

3.33

3 отзыва

Оценить канал javaproglib и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

1

4 звезд

1

3 звезд

0

2 звезд

0

1 звезд

1


Последние сообщения 5

4 сен 2025
Назовите все методы класса Object?

Класс Object — это базовый класс для всех классов в Java. Он содержит следующие методы:

public final Class getClass() – возвращает объект Class для текущего объекта.
public int hashCode() – возвращает хэш-код объекта.
public boolean equals(Object obj) – сравнивает объекты на равенство.
protected Object clone() – создает копию объекта (глубокое/поверхностное копирование зависит от реализации).
public String toString() – строковое представление объекта.
public final void notify() – пробуждает один поток, ожидающий монитор объекта.
public final void notifyAll() – пробуждает все потоки, ожидающие монитор объекта.
public final void wait() – заставляет поток ждать, пока его не разбудят через notify/notifyAll.
public final void wait(long timeout) – ждет указанное время или до уведомления.
public final void wait(long timeout, int nanos) – более точная версия ожидания.
protected void finalize() – вызывается перед удалением объекта сборщиком мусора (deprecated с Java 9).

Библиотека собеса по Java
2.53K views21:11
Подробнее
Поделиться:
Открыть/Комментировать
3 сен 2025
Переворачиваем календарь — а там скидки, которые уже закончились.

Но мы их вернули на последний день

До 00:00 третьего сентября (цены как до 1 сентября):

Математика для Data Science — 35.199 ₽ вместо 44.900 ₽
Алгоритмы и структуры данных — 31.669 ₽ вместо 39.900 ₽
Основы IT — 14.994 ₽ вместо 19.900 ₽
Архитектуры и шаблоны — 24.890 ₽ вместо 32.900 ₽
Python — 24.990 ₽ вместо 32.900 ₽
ML для Data Science — 34.000 ₽ вместо 44. 000 ₽
AI-агенты — 49.000 ₽ вместо 59.000 ₽

Хватаем скидки из прошлого

P.S. Машину времени одолжили у дяди Миши
2.24K views19:00
Подробнее
Поделиться:
Открыть/Комментировать
3 сен 2025
Когда выбрать EnumMap вместо HashMap

В стандартной библиотеке Java есть множество реализаций Map, но когда в качестве ключей используются значения перечислений (enum), оптимальным выбором будет именно EnumMap.

Логика выбора коллекции

HashMap — универсальный ключ-значение, хранит что угодно, но тратит память на hashCode.
TreeMap — ключи в отсортированном порядке, но медленнее.
LinkedHashMap — хранит порядок вставки.
EnumMap — заточен под enum-ключи, самый быстрый и компактный для этого случая.

Почему EnumMap крут

Использует массив под капотом, а не хеш-таблицу — значит, lookup работает за O(1) без вычисления хэшей.
Очень экономен по памяти (не хранит объекты Map.Entry).
Гарантированно хранит ключи в порядке объявления enum-констант.

Пример

enum Status { NEW, IN_PROGRESS, DONE }

EnumMap map = new EnumMap<>(Status.class);
map.put(Status.NEW, "Создан");
map.put(Status.IN_PROGRESS, "В работе");
map.put(Status.DONE, "Завершён");

for (var entry : map.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}

Когда использовать

— Ключи всегда являются значениями одного enum.
— Важен быстрый доступ к элементам и сохранение порядка ключей.
— Необходимо минимизировать использование памяти.

Когда не подходит

— Ключи не являются enum.
— Требуется поддержка null в качестве ключа.

Расскажите про боевой кейс использования в комментах.

Библиотека джависта

#буст
2.55K viewsedited  07:53
Подробнее
Поделиться:
Открыть/Комментировать
2 сен 2025
Разница между Mock, Stub и Fake в тестировании

В тестировании часто встречаются термины Mock, Stub и Fake. Все они относятся к подмене реальных зависимостей, но выполняют разные роли. Давайте разберемся, в чем их отличие и когда применять каждый из них.

Mock

Мок — это объект, поведение которого мы заранее определяем. Мы говорим, какие методы должны быть вызваны, какие значения возвращать, и проверяем, были ли вызваны эти методы в тесте.

Пример:
@Test
public void testService() {
MyService service = mock(MyService.class);
when(service.getData()).thenReturn("Hello, World");

assertEquals("Hello, World", service.getData());
}

Идеальный выбор для тестирования взаимодействий между компонентами, когда нужно удостовериться, что объект выполняет определенные действия в процессе работы программы.

Stub

Стаб — это объект, который возвращает заранее заданные значения. Он просто заменяет реальную зависимость, не проверяя, как она используется, а только подставляет нужные значения.

Пример:
@Test
public void testService() {
MyService service = new StubService();
assertEquals("Mocked Data", service.getData());
}

Полезен, когда необходимо изолировать тестируемый компонент от других, например, при тестировании бизнес-логики, где важно не загружать реальные сервисы.

Fake

Фейк — это объект, который имеет реальное поведение, но в упрощенной или в ограниченной форме. Он может быть использован вместо реального объекта, но не имеет всех возможностей или работает быстрее.

Пример:

public class FakeDatabase implements Database {
private Map data = new HashMap<>();

public void insert(String key, String value) {
data.put(key, value);
}

public String get(String key) {
return data.get(key);
}
}

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

Что чаще используете при тестировании?

Библиотека джависта

#буст
2.37K viewsedited  18:28
Подробнее
Поделиться:
Открыть/Комментировать
27 авг 2025
Задача с собеса: Потокобезопасный LRU-кэш с TTL (middle)

Отдохнули и хватит
Интересная задачка с реального собеседования:

Компания хочет снизить нагрузку на БД и внешние API. Реализуйте in-memory кэш, который:

— хранит не более N элементов (LRU-политика вытеснения)
— истекает срок действия записей по TTL
— потокобезопасен и работает за O(1) на get/put

Условия

1. put(k, v) кладёт значение с TTL (единый для экземпляра).
2. get(k) возвращает значение или null, если пары нет или истёк TTL.
3. При переполнении удаляется «наименее недавно использованный» элемент.
4. Решение должно быть неблокирующим по чтению или, как минимум, с короткими критическими секциями.
5. Допустимо ленивое удаление устаревших записей (на чтении/записи).

Ключевые моменты:

— Выбор структуры: LinkedHashMap с accessOrder=true даёт LRU «из коробки».
— TTL: храните expireAt на элемент; чистите лениво и/или периодически.
— Потоки: короткие секции под ReentrantReadWriteLock (или один ReentrantLock) вокруг критичных операций.
— Амортизация O(1): не делайте полных проходов по карте на каждом вызове.

Возможная реализация в комментариях. Пишите также ваши реализация и способы оптимизации.

Библиотека собеса по Java
565 views08:47
Подробнее
Поделиться:
Открыть/Комментировать
26 авг 2025
Обратная связь

Друзья, давайте сделаем контент лучше вместе. Расскажите, что вам сейчас наиболее интересно в Java?

Возможные направления:

— Многопоточность и конкурентность (best practices, паттерны)
— Работа с БД и ORM (Hibernate, JOOQ, тонкости оптимизации запросов)
— Spring Boot (реальные кейсы, архитектурные решения)
— JVM (память, GC, тюнинг производительности)
— Алгоритмы и структуры данных
— Безопасность и практики secure-coding
— Инструменты: тестирование, CI/CD, мониторинг

Пишите в комментариях, что сейчас изучаете или было бы интересно изучить. Постараемся адаптировать посты под наиболее интересные темы.

Библиотека джависта
1.32K views18:21
Подробнее
Поделиться:
Открыть/Комментировать
26 авг 2025
Так, владелец макбука. Хватит позировать в кофейне.

Настоящее портфолио — это не стикеры на крышке, а проект с чистым кодом, README и рабочей демкой.

Не знаешь, как такой собрать? Научим. Наш курс «ML для старта в Data Science» — это пошаговый гайд к проекту, за который не стыдно.

ОСТАЛАСЬ НЕДЕЛЯ, чтобы забрать его по старой цене в 44.000 ₽. С 1 сентября — всё.

И да, при покупке курса ML до 1 сентябрякурс по Python получаешь бесплатно.

Апгрейд от «вайба» до «оффера» тут
1.51K views15:05
Подробнее
Поделиться:
Открыть/Комментировать
25 авг 2025
Топ-вакансий для джавистов за неделю

Senior Java Developer (MAX) — от 300 000 ₽ — удалёнка

Программист Java — от 100 000 до 140 000 ₽ — офис (Москва)

Java-разработчик — 300 000 —‍ 490 000 ₽ — гибрид (Москва)

Java Developer (Клик) — от 400 000 ₽ — гибрид (Москва)

Еще больше топовых вакансий — в нашем канале Java jobs
1.94K views17:06
Подробнее
Поделиться:
Открыть/Комментировать
25 авг 2025
Новый поток курса — собери своих AI-агентов

7 октября стартует второй поток курса «AI-агенты для DS-специалистов».
За 5 недель вы научитесь собирать агентов, которые уже сейчас будут помогать бизнесу.

В кружке выше Максим Шаланкин, наш преподаватель, рассказывает подробнее — включай, чтобы не пропустить.

Записаться на курс
2K views15:03
Подробнее
Поделиться:
Открыть/Комментировать
25 авг 2025
1.77K views06:02
Подробнее
Поделиться:
Открыть/Комментировать
24 авг 2025
Библиотека джависта

#развлекалово
2.16K views20:10
Подробнее
Поделиться:
Открыть/Комментировать
24 авг 2025
Унификация API-ошибок в Spring Boot

Чёткая схема API помогает наладить диалог между провайдером и клиентом, а единый формат ошибок — избавить потребителей от хаоса в коде и лишних поводов для «боли».

В Spring Boot по умолчанию структура ошибок выглядит так:

{
"timestamp": "2021-15-08T14:32:17.947+0000",
"status": 500,
"error": "Internal Server Error",
"path": "/test"
}

Такая форма ответа не всегда содержит тип ошибки для обработки на клиенте, а также предоставляет мало контекста для формирования пользовательских сообщений.

Решение: разработать унифицированную структуру, например:

{
"error": {
"type": "USER_NOT_FOUND",
"message": "User with ID 12345 not found.",
"status": 500,
"path": "/integration/apps",
"timestamp": "2021-15-08T14:32:17.947+0000",
"data": {
"userId": "12345"
}
}
}

Как внедрить:

Создаём единое исключение AppException:
public final class AppException extends RuntimeException {
private final ErrorType type;
private Map data;
// конструктор и геттеры...
}
public enum ErrorType {
USER_NOT_FOUND(404), AUTHENTICATION_FAILED(401), …;
private final int status;
// геттеры...
}

Глобальный обработчик:
Используем @ControllerAdvice с @ExceptionHandler(AppException.class) для перехвата ошибок и возвращения QErrorResponse, содержащего нужную структуру

Обработка всех остальных ошибок:
Создаём свой ErrorController, заменяющий BasicErrorController, и возвращаем данные в таком же формате QErrorResponse:

@RestController
@RequestMapping("${server.error.path:${error.path:/error}}")
public class RestErrorController extends AbstractErrorController {
// логика формирования QErrorResponse…
}

Это гарантирует, что любые ошибки возвращаются в одинаковом формате .

Почему это важно:

— Унификация ответа облегчает обработку ошибок на клиенте.
— Контекст в data позволяет выдавать более понятные сообщения пользователю.
— Расширяемость дает возможность добавлять новые типы ошибок при сохранении консистентности.

Библиотека джависта

#буст
2.1K views07:37
Подробнее
Поделиться:
Открыть/Комментировать
23 авг 2025
Что действительно важно в Java 21

Ну всё, хватит отдыхать
Обсудим интересные фичи 21 java.

Переход на версию LTS — не просто "модно", а реальная возможность повысить продуктивность проекта. Вот на что стоит обратить внимание:

Виртуальные потоки (Virtual Threads)

При миллионе одинаковых тестовых задач время получается следующее :
— FixedThreadPool : 33 мин.
— CachedThreadPool : 1:26 мин.
— VirtualThreadPerTask : всего 14 секунд

Производительность и масштабируемость на новом уровне.

Улучшенные паттерны и паттерн-свитчи

Record-паттерны позволяют одновременно проверять тип и извлекать поля, свитчи стали мощнее — меньше кода, больше читаемости.

Generational ZGC (Garbage Collector)

Минимальные задержки (sub-миллисекунды) и оптимальное управление памятью, что идеально для latency-чувствительных приложений.

Строковые шаблоны (String Templates)

Новый синтаксис для динамических строк (например, JSON-создание) создает меньше ошибок и улучшает читаемость.

Коллекции с упрощённой навигацией (Sequenced Collections)

Последовательные операции легко доступны: getFirst(), getLast(), reversed() — удобно и логично.

Кто уже работал с виртуальными потоками?

Библиотека джависта

#буст
2.03K viewsedited  18:06
Подробнее
Поделиться:
Открыть/Комментировать
23 авг 2025
Отдыхаешь?
2.05K views15:00
Подробнее
Поделиться:
Открыть/Комментировать
23 авг 2025
Как устроена масштабируемая система

Представьте, что вам нужно обрабатывать миллионы запросов и файлов — как это сделать эффективно? Ответ кроется в правильном проектировании архитектуры.

Вот ключевые компоненты:

DNS — запросы перенаправляются на нужный сервер.

Балансировка нагрузки — равномерное распределение трафика между серверами для избежания перегрузок.

Масштабирование — использование распределенных сервисов и кеширования для работы с большими объемами данных.

Обработка медиа — загрузка и обработка изображений/видео с последующей обработкой метаданных.

Базы данных — распределение данных и управление запросами для обеспечения высокой доступности.

Эти компоненты обеспечивают масштабируемость и надежность системы, позволяя обрабатывать любые объемы данных без потери производительности.

Библиотека джависта

#буст
2.33K viewsedited  21:21
Подробнее
Поделиться:
Открыть/Комментировать
22 авг 2025
В чём разница между Statement и PreparedStatement?

— Statement используется для выполнения простых SQL-запросов без параметров. Он формирует запрос как строку и каждый раз компилирует его заново, что может быть медленно и небезопасно.

— PreparedStatement предварительно компилируется базой данных и позволяет задавать параметры через плейсхолдеры. Что повышает производительность при многократном выполнении одного запроса и защищает от SQL-инъекций (данные не конкатенируются со строкой запроса, а подставляются корректно).

Поэтому в реальных проектах почти всегда используют PreparedStatement.

Библиотека собеса по Java
2.27K views10:28
Подробнее
Поделиться:
Открыть/Комментировать
21 авг 2025
Библиотека джависта

#развлекалово
2.71K views20:19
Подробнее
Поделиться:
Открыть/Комментировать
21 авг 2025
Сегодня в 19:00 МСК — бесплатный вебинар с Марией Жаровой.

Тема: «Введение в ML: как спрогнозировать стоимость недвижимости».

Разберём задачу прогноза стоимости недвижимости.
Покажем пошагово, как собрать первую модель.
Получите готовые скрипты для старта.

Не зайдёшь — будешь ещё год делать вид, что понимаешь графики в чужих презентациях.

Регистрируйтесь
2.61K views12:37
Подробнее
Поделиться:
Открыть/Комментировать
21 авг 2025
JUnit 5: @ClassTemplate

В JUnit 5 появилась интересная аннотация @ClassTemplate. Она полезна, когда один и тот же набор тестов нужно выполнить в разных контекстах. Например: проверить класс с разными локалями, флагами или окружениями.

Обычно в таких случаях мы либо дублируем тестовые классы, либо городим параметризованные тесты. Но @ClassTemplate позволяет описать тест один раз, а запускать его несколько раз — каждый раз в новом окружении.

Как это работает

— Помечаем тестовый класс @ClassTemplate.
— Регистрируем ClassTemplateInvocationContextProvider, который возвращает список «контекстов» (например, en/it).
— JUnit прогоняет один и тот же класс для каждого контекста.

Пример

— Есть Greeter, который должен возвращать приветствие по-английски и по-русски.
— Мы пишем один тест → JUnit запускает его дважды: для en и для ru.
— В отчёте два результата, код теста при этом один.

Важные детали

— Работает начиная с JUnit 5.13.
— Для читаемых логов удобнее запускать через JUnit Console Launcher.
— Отличается от @TestTemplate тем, что переиспользует весь класс, а не отдельные методы.

А вы чаще решаете такие задачи параметризацией или дублированием тестов?

Библиотека джависта

#буст
2.34K views06:14
Подробнее
Поделиться:
Открыть/Комментировать
20 авг 2025
Один мудрый тимлид дал двум своим разработчикам по «таланту» — мощной, но своенравной LLM.

Первый разработчик испугался её «галлюцинаций». Он запер модель в песочнице, не давая ей доступа к свежим данным. На вопросы модель отвечала красиво, но часто придумывала факты, то есть врала. Он просто «закопал» свой талант, боясь им пользоваться.

Второй же разработчик не побоялся. Он построил для своей LLM систему RAG — дал ей «лопату и карту», чтобы находить сокровища в базе знаний компании. Его AI-агент отвечал точно по делу, ссылаясь на реальные документы. Он заставил свой «талант» работать и приносить пользу.

Мощь LLM раскрывается не в ней самой, а в системах, которые вы строите вокруг неё.

Именно такие системы мы и будем строить на втором потоке нашего курса «AI-агенты для DS-специалистов». Мы не просто поговорим о RAG, а соберём полный пайплайн с оценкой качества, чтобы ваш агент не врал.

Представьте, что вы сможете начать изучать эту сложную и востребованную тему уже 15 сентября, а не ждать официального старта в октябре. У вас будет фора в 3 недели, чтобы спокойно разобраться в векторных базах и подходе «LLM as a Judge».

Цена 49.000 ₽ действует последние 4 дня — до 24 августа.

Начать строить RAG раньше других
2.33K viewsedited  14:54
Подробнее
Поделиться:
Открыть/Комментировать
20 авг 2025
Обратная связь

По воскресеньям выходит пост с подборкой свежих статей/новостей. Посты собирают мало реакций, в связи с чем вопрос: как вы оцениваете эту рубрику?

— Мне нравится, иногда нахожу, что почитать.
— Рубрика нормальная, но можно улучшить формат поста.
— Скучно/не интересно, лучше что-то другое постить.

И пишите любые ваши мысли и предложения в комментариях, сделаем контент интереснее вместе.
2.25K views07:03
Подробнее
Поделиться:
Открыть/Комментировать
12 авг 2025
Библиотека джависта

#развлекалово
1.54K viewsedited  20:04
Подробнее
Поделиться:
Открыть/Комментировать
12 авг 2025
Сохраняйте шпаргалку по join'ам в SQL

Библиотека джависта

#буст
1.87K viewsedited  08:54
Подробнее
Поделиться:
Открыть/Комментировать
11 авг 2025
Топ-вакансий для джавистов за неделю

Java Developer — от 75 000 ₽ — удалёнка

Java Developerот 180 000 ₽ — удалёнка

Java разработчикдо 450 000 ₽ — удалёнка

Java-Разработчикдо 250 000 ₽ — удалёнка

Еще больше топовых вакансий — в нашем канале Java jobs
2.11K views18:01
Подробнее
Поделиться:
Открыть/Комментировать
11 авг 2025
1.99K views07:48
Подробнее
Поделиться:
Открыть/Комментировать
10 авг 2025
Java Digest: подборка материалов

IntelliJ IDEA переходит на единый дистрибутив

Начиная с IntelliJ IDEA 2025.3 больше не будет разделения на Community и Ultimate Edition. Вместо этого будет один установщик. При этом ряд функций все еще будет доступен только по подписке, как это сейчас работает в Ultimate Edition.

IntelliJ IDEA переходит на единый дистрибутив (Ру)

Перевод от команды Spring АйО на русский прошлой новости.

Spring Data JDBC и R2DBC 4.0 получат поддержку составных идентификаторов

Если моделировали первичный ключ из нескольких полей в Spring Data JDBC или R2DBC, то знаете, что это непросто. С версии 4.0.0-M4 вы просто описываете record, помечаете его как @Id, и все работает.

Библиотека джависта

#свежак
2.25K viewsedited  18:23
Подробнее
Поделиться:
Открыть/Комментировать
9 авг 2025
Зоопарк моделей в ML: с чего начать?

Открываешь статью по машинному обучению — и в тебя летят слова: трансформеры, бустинги, SVM, регрессии.

Кажется, придётся учить всё это, иначе в ML не пустят.

Хорошая новость: 90% задач можно закрыть 2–3 классическими методами. Разберёшь их — уже сможешь собирать работающие проекты. А хайповые названия подождут.

Важно: не распыляйся на всё подряд. Начни с базового — это фундамент, на котором держится остальное.

Успей попасть на курс «ML для старта в Data Science»
2.24K views15:30
Подробнее
Поделиться:
Открыть/Комментировать
8 авг 2025
Библиотека джависта

#развлекалово
2.44K viewsedited  19:31
Подробнее
Поделиться:
Открыть/Комментировать
8 авг 2025
Как подключить S3 для хранения файлов

S3-совместимое хранилище (AWS S3, MinIO, Yandex Object Storage и т.п.) — удобный способ хранить файлы вне приложения. Подключим его к Spring Boot и реализуем минимальный upload/download.

Зависимости

software.amazon.awssdk
s3
2.25.60


org.springframework.boot
spring-boot-starter-web

ИЛИ
implementation 'software.amazon.awssdk:s3:2.25.60'
implementation 'org.springframework.boot:spring-boot-starter-web'

Конфигурация (application.yml)
s3:
region: eu-central-1
accessKey: minioadmin
secretKey: minioadmin
bucket: demo-bucket
spring:
servlet:
multipart:
max-file-size: 20MB
max-request-size: 20MB

Бины клиента S3
@Configuration
public class S3Config {

@Bean
public S3Client s3Client(S3Props props) {
var builder = S3Client.builder()
.credentialsProvider(StaticCredentialsProvider.create(
AwsBasicCredentials.create(props.accessKey(), props.secretKey())))
.region(Region.of(props.region()))
.httpClientBuilder(UrlConnectionHttpClient.builder());

if (props.endpoint() != null && !props.endpoint().isBlank()) {
builder = builder
.endpointOverride(java.net.URI.create(props.endpoint()))
.serviceConfiguration(S3Configuration.builder()
.pathStyleAccessEnabled(props.pathStyleAccess())
.build());
}
return builder.build();
}

@Bean
public S3Props s3Props(org.springframework.core.env.Environment env) {
return new S3Props(
env.getProperty("s3.endpoint"),
env.getProperty("s3.region", "eu-central-1"),
env.getProperty("s3.accessKey"),
env.getProperty("s3.secretKey"),
env.getProperty("s3.bucket", "demo-bucket"),
Boolean.parseBoolean(env.getProperty("s3.pathStyleAccess", "true"))
);
}

public record S3Props(String endpoint, String region, String accessKey,
String secretKey, String bucket, boolean pathStyleAccess) {}
}

Сервис для загрузки/скачивания
@Service
@RequiredArgsConstructor
public class S3StorageService {
private final S3Client s3;
private final S3Config.S3Props props;

public String upload(String originalName, String contentType, byte[] bytes) {
String key = UUID.randomUUID() + "_" + originalName;
s3.putObject(PutObjectRequest.builder()
.bucket(props.bucket())
.key(key)
.contentType(contentType)
.build(),
RequestBody.fromBytes(bytes));
return key;
}

public byte[] download(String key) {
GetObjectResponse[] meta = new GetObjectResponse[1];
try (var resp = s3.getObject(GetObjectRequest.builder()
.bucket(props.bucket()).key(key).build())) {
meta[0] = resp.response();
return resp.readAllBytes();
} catch (Exception e) {
throw NoSuchKeyException.builder().message("Object not found: " + key).build();
}
}

public void createBucketIfMissing() {
var bucket = props.bucket();
var exists = s3.listBuckets().buckets().stream().anyMatch(b -> b.name().equals(bucket));
if (!exists) s3.createBucket(CreateBucketRequest.builder().bucket(bucket).build());
}
}

Как вы храните пользовательские файлы в продакшене?

Библиотека джависта

#буст
2.21K viewsedited  09:17
Подробнее
Поделиться:
Открыть/Комментировать
8 авг 2025
Библиотека джависта | Java, Spring, Maven, Hibernate pinned a photo
09:03
Подробнее
Поделиться:
Открыть/Комментировать