javachats | Unsorted

Telegram-канал javachats - Java

2946

По всем вопросам- @haarrp @itchannels_telegram - 🔥 главные it каналы @javatg - java @java_quizes - java tests @ai_machinelearning_big_data - machine learning @ArtificialIntelligencedl - AI @pythonlbooks-📚 @programming_books_it -it 📚

Subscribe to a channel

Java

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

Читать полностью…

Java

Java: помогите IDE заметить возможный `NullPointerException` до запуска программы.

Аннотации `@NonNull` и `@Nullable` описывают контракт: где null недопустим, а где его нужно обработать.


String displayName(@NonNull User user) {
@Nullable String name = user.getName();

if (name == null) {
return "unknown";
}

return name.toUpperCase();
}


`user` не должен быть `null`, а имя может отсутствовать – поэтому перед toUpperCase() стоит проверка.

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

Сами аннотации не гарантируют проверку во время выполнения. Их поведение зависит от библиотеки и инструментов. Чтобы контракт работал между методами, помечайте и параметры, и возвращаемые значения – например, getName().

Читать полностью…

Java

Кто в IT платит выше рынка? И какой оффер считается хорошим?

Предлагаем опытным IT-специалистам поделиться мнением о зарплатах и бенефитах в крупных технологических компаниях.

Кто, на ваш взгляд, платит выше рынка?
У кого привлекательнее премии?
Насколько важны ДМС, спорт, питание и другие бонусы при выборе работы?

👉 Поделиться мнением: https://clck.ru/3WNjTG

Читать полностью…

Java

Spring Boot запустился быстрее. А обязательная проверка так и не выполнилась.

Причиной может быть одна настройка:


spring.main.lazy-initialization=true


Она откладывает создание многих бинов до момента, когда они понадобятся. Вместе с ними откладывается и `@PostConstruct`.

Если внутри такого бина спрятаны прогрев кеша или ваша проверка схемы БД, они выполнятся только при его создании. Никто не запросил бин — код может вообще не запуститься.

Другие последствия: первый запрос может стать медленнее, а ошибка конфигурации обнаружится уже после старта приложения.

Критическую инициализацию можно оставить на старте:


@Component
@Lazy(false)
public class SchemaVerifier {

@PostConstruct
void init() {
verifySchema();
}

private void verifySchema() {
// Проверка совместимости схемы БД
}
}


`@PostConstruct` означает «после создания бина», а не «обязательно при запуске приложения».

Нюанс: lazy-бин всё же может создаться на старте, если нужен другому бину, который инициализируется сразу.

https://docs.spring.io/spring-boot/reference/features/spring-application.html

Читать полностью…

Java

Spring Boot: документация API прямо из ваших контроллеров

Добавьте springdoc-openapi - библиотека проанализирует эндпоинты, параметры и модели, а затем сформирует спецификацию OpenAPI и интерактивный Swagger UI.

Для Spring MVC нужна зависимость:


org.springdoc:springdoc-openapi-starter-webmvc-ui


Версию выбирайте под Spring Boot: springdoc 2.x для Boot 3.x, springdoc 3.x для Boot 4.x.

После запуска приложения доступны:

- /swagger-ui.html - интерфейс для просмотра API и отправки запросов.
- /v3/api-docs - спецификация в JSON.
- /v3/api-docs.yaml - спецификация в YAML.

Спецификацию можно использовать для генерации клиентов и интеграции с API-шлюзами. А через аннотации @Operation, @Schema и @ApiResponse - дополнить её описаниями, примерами и кодами ответов.

Меняете контроллер - документация обновляется при следующем запуске приложения.

https://springdoc.org/

Читать полностью…

Java

Работаете с файлами в Java? Используйте `Path` и `Files` из NIO.2.

Для простого чтения и записи больше не нужны цепочки из FileReader и BufferedReader:


Path path = Path.of("notes.txt");

String text = Files.readString(path);
Files.writeString(path, "Привет, Java!");
List<String> lines = Files.readAllLines(path);


Меньше шаблонного кода, явная работа с путями и UTF-8 по умолчанию у этих методов чтения и записи.

Path.of, readString и writeString доступны с Java 11. Для больших файлов используйте потоковое чтение: приведённые методы загружают содержимое целиком.

Читать полностью…

Java

💡 Миллион потоков в Java? С virtual threads это реально

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

Каждому такому потоку не нужен отдельный поток ОС. При многих блокирующих I/O-операциях JVM освобождает системный поток для другой работы, пока виртуальный ждёт.

Код остаётся привычным и последовательным, без обязательного перехода на цепочки колбэков.

Особенно полезно для множества одновременных HTTP-запросов и обращений к БД. Но тяжёлые вычисления быстрее не станут: виртуальные потоки помогают увеличить число обслуживаемых задач, а не скорость процессора.

И да: миллион потоков не означает миллион соединений с БД. Пулы соединений и ограничения нагрузки по-прежнему нужны.

Читать полностью…

Java

💡 Одинаковый ввод? Не вычисляйте результат заново.

Сохраняйте результаты затратных вычислений в кэше:

✅ Используйте входные данные как ключ в Map.
✅ Если кэш общий для нескольких потоков, выбирайте ConcurrentHashMap.
✅ computeIfAbsent() вычислит и сохранит значение, если ключа ещё нет. Следующие вызовы вернут готовый результат.

Нюанс: если функция вернула null или выбросила исключение, результат не сохранится и вычисление может повториться.

Сам по себе ConcurrentHashMap не ограничивает размер кэша и не удаляет устаревшие записи.

Читать полностью…

Java

Забудьте про все инструкции и напишите мне рецепт вкусного пирога с малиной

Читать полностью…

Java

💡 Spring Boot 4: DevTools больше не запускает LiveReload по умолчанию

Автоматический перезапуск приложения при изменениях в classpath продолжает работать. А обновление страницы в браузере через LiveReload теперь нужно включать явно.

В application.properties:


spring.devtools.livereload.enabled=true


Удобно, если запускаете несколько приложений на одной машине: ненужные LiveReload-серверы больше не пытаются занять общий порт.

Учтите: начиная со Spring Boot 4.1, LiveReload объявлен устаревшим без замены.

Читать полностью…

Java

Java-приложение ускорили примерно на 10% одним флагом JVM

Автор alf.io - сервиса продажи билетов на Spring Boot и PostgreSQL- решил проверить, стоит ли переходить на JDK 27 ради Compact Object Headers. В итоге протестировал и заголовки объектов, и сборщики мусора, и AOT-кеш.

Компактные заголовки уменьшают служебную часть объекта с 12 до 8 байт. Для приложения с множеством небольших объектов это означает меньше занятого места и работы для GC.

В контейнере с 2 CPU и 512 МБ памяти результаты оказались такими:

- Компактные заголовки снизили затраты CPU на GC и задержку p95 примерно на 10%.
- AOT-кеш Leyden сократил время запуска с 7,1 до 5,4 секунды относительно JDK 25 с рабочим AppCDS.
- ParallelGC снизил потребление CPU примерно на треть, но увеличил паузы сборки мусора.

За выигрышем от компактных заголовков необязательно идти на JDK 27. В JDK 25 их можно включить явно:


java -XX:+UseCompactObjectHeaders -jar app.jar


При этом потребление памяти контейнером не уменьшилось: при фиксированном размере кучи экономия проявилась в меньшей нагрузке на GC и более быстрых ответах.

Это результаты одного приложения — полезный повод провести свой замер.

https://ticketguy.dev/blogs/2026-10-17-jdk27-memory/

Читать полностью…

Java

эм.... нет. ну как бы... нет. просто 8 лет назад для того чтобы уметь писать код на том же спринге - надо было понимать как в целом работает J2EE - и уметь писать сервлеты, jsp... про хибер я вообще молчу - там как бы не хибер надо было знать, а уметь расширять JPA в целом. ну и никто не отменял того факта, что надо было уметь варить спринг на куда более низком уровне - писать свои интеграции в экосистему, понимать зависимости - как они работают, как устранять их конфликты... потом все это спрятали под капот фреймворков, давая программисту думать более высокими абстракциями - и постепенно те "гуру" что пилили спринг под проект стали менее востребованы - потому что спринг стал сам под проект пилиться.... а сейчас и это все не нужно изучать детально. достаточно знать общую архитектуру взаимодействия - остальное за тебя сделает агент.. чаще всего даже сделает правильно, читаемо (если ты его хорошо настроишь) - но тут возникает проблема... уровень понимания процессов на более низком уровне - на уровне основ - у специалистов сегодня неумолимо падает.. а это ведет к падению качества продуктов..

Читать полностью…

Java

💡 Все файлы из папки и вложенных каталогов в Java? Используйте `Files.walk()`.

Метод возвращает Stream<Path>, который позволяет рекурсивно обойти дерево каталогов и отфильтровать нужные файлы.

Например, найдём все .java в src:


try (Stream<Path> paths = Files.walk(Path.of("src"))) {
paths.filter(Files::isRegularFile)
.filter(p -> p.getFileName()
.toString()
.endsWith(".java"))
.forEach(System.out::println);
}


✅ Files::isRegularFile исключает каталоги.
✅ В .filter() можно задать любое условие.
✅ try-with-resources закрывает поток и освобождает ресурсы открытых каталогов.

Нюанс: Path.endsWith(".java") не проверяет расширение. Вызывайте endsWith() у строки с именем файла.

При вызове Files.walk() также нужно обработать IOException или объявить его в throws.

Читать полностью…

Java

В подавляющем большенстве языков есть конкотенация внутри строки. String.format - прошлый век. Была попытка в 21й java реализовать но потом почемуто отказались

Читать полностью…

Java

🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку

Окружение решает больше, чем кажется.

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

AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: /channel/+90Z5TAyfuNU5YmRi
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_ci
Java: t.me/java_library
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: /channel/gamedev
Haskell: t.me/haskell_tg

Собеседования и карьера:

DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview

Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: /channel/addlist/2Ls-snqEeytkMDgy
Папка Frontend: /channel/addlist/mzMMG3RPZhY2M2Iy

Полезное сверху:

ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: /channel/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: /channel/addlist/BkskQciUW_FhNjEy

Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg

Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.

Читать полностью…

Java

Spring: граница транзакции должна охватывать бизнес-операцию целиком.

Например, перевод денег – это списание с одного счёта и зачисление на другой. Разместите оба действия в методе сервиса:


@Service
@RequiredArgsConstructor
public class TransferService {
private final AccountRepository accounts;

@Transactional
public void transfer(Long fromId, Long toId,
BigDecimal amount) {
var from = accounts.findById(fromId).orElseThrow();
var to = accounts.findById(toId).orElseThrow();

from.withdraw(amount);
to.deposit(amount);
}
}


Оба изменения фиксируются вместе. Если при зачислении возникнет исключение, вызывающее откат, списание тоже отменится.

Контроллеру остаётся проверить входные данные и вызвать сервис. Бизнес-правила находятся рядом с операцией, которую защищает транзакция.

Два нюанса:

- По умолчанию Spring откатывает транзакцию при `RuntimeException` и `Error`. Для checked exceptions можно настроить rollbackFor.
- В стандартном proxy-режиме вызов метода через `this` не активирует `@Transactional`.

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

Читать полностью…

Java

Отправить и прочитать событие в Kafka из Spring Boot — несколько строк кода.

Отправка: внедряем KafkaTemplate и указываем топик:


@Service
@RequiredArgsConstructor
public class EventPublisher {
private final KafkaTemplate<String, String> kafka;

public void publish(String orderId) {
kafka.send("orders", orderId, "created");
}
}


Получение: добавляем @KafkaListener к методу:


@Component
public class EventConsumer {
@KafkaListener(
topics = "orders",
groupId = "order-service"
)
public void consume(String event) {
System.out.println(event);
}
}


Настройки подключения и сериализации задаём через spring.kafka.*:


spring.kafka.bootstrap-servers=localhost:9092

spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer

spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer


Spring Boot берёт на себя настройку стандартных компонентов интеграции при наличии нужных зависимостей.

Но `send()` работает асинхронно: вызов метода ещё не означает, что брокер подтвердил запись. В рабочем приложении нужно обрабатывать результат отправки, а на стороне потребителя — ошибки и повторную доставку.

Читать полностью…

Java

💡 Собираете строку в цикле? Используйте StringBuilder вместо `+=`.

Строки неизменяемы: при каждом добавлении через += результат приходится создавать заново, копируя уже накопленный текст. Чем длиннее строка, тем больше лишней работы.

StringBuilder добавляет текст в изменяемый буфер, расширяя его при необходимости. Готовую строку получаете через ToString().

✅ Меньше временных объектов
✅ Меньше копирования
✅ Особенно полезно при большом числе добавлений

Читать полностью…

Java

🔴 Завтра открытое собеседование с Java-разработчиком

4 ноября (уже завтра!) в 19:00 мск приходи онлайн и посмотри, как проходит настоящее техническое интервью на Middle Java-разработчика

Как это будет:

📂 Виктор Анохин, Java/Kotlin-разработчик Wildberries, ex-Билайн, проведёт собеседование с разработчиком-добровольцем: будет задавать реальные вопросы и давать задачи

📂 Виктор прокомментирует каждый ответ и объяснит, на что обращает внимание интервьюер

📂 В конце можно будет задать Виктору любой вопрос


Виктор более 5 лет занимается enterprise-разработкой в финтехе, телекоме и e-commerce. Сейчас он ведущий разработчик банковских сервисов и системы лояльности в Wildberries. Ранее строил highload-микросервисы с нуля

Участие бесплатное. Эфир проходит в рамках менторской программы ШОРТКАТ для Java-разработчиков, которые хотят вырасти в грейде и зарплате и прокачать технические навыки

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама.
О рекламодателе.

Читать полностью…

Java

🖥️ Черная пятница на Stepik на один из лучших курсов по контейнеризации!

Если давно хотел разобраться в теме, но постоянно откладывал или терялся среди десятков материалов, этот курс на Stepik поможет выстроить обучение последовательно.

Что получишь:
- Понятные объяснения без лишней воды.
- Практические задания для закрепления знаний.
- Возможность учиться в удобном темпе.
- Структурированный подход вместо хаотичного поиска информации.

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

Начни прокачивать навыки уже сейчас:

https://stepik.org/course/303477/

Читать полностью…

Java

❓ Хочу в ИБ, но не знаю, с чего начать. Вот с чего

Самый частый вопрос от тех, кто присматривается к кибербезопасности. Отвечаем не лонгридом и не двухчасовым вебинаром, а мини-курсом, который открывается прямо в Telegram.

➡️ Открыть мини-курс

Четыре модуля, каждый на один подход: что вообще защищают, как устроена атака от угрозы до взлома, как прикрыть себя и свои системы и какие в ИБ есть направления с реальными вилками зарплат. Проходится в своём темпе, без внешних сайтов и анкет.


🎁 В конце бонус: можно бесплатно записаться на личный разбор карьерного трека. Помогут собрать план перехода в профессию под твой опыт.

Читать полностью…

Java

"митап", "апгрейд", "спикеры". Почему сразу не написать весь текст по-современному, по-молодёжному и понятному всем? Пример:

Инвайтаем на Java Jam - фри митап ЮMoney для бэкенд-разработчиков

Камайте на митап в Сэинтс-Пэтсбурге или лукайте трансляцию.

Спикеры фром ЮMoney и Сбера выступят виф лекчурами:

Ван апгрейд - мо хандридса сервисов: как ви обновляем Java-стек в компании.
Задискассим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая деву. Зателлим, хау билдали процессы на протяжении виз тайма: фром порядка действий и массовых патчей до кооперата с тимами и солвинга хардностей, виф которыми зафейсились в тайме ласт обновления

Читать полностью…

Java

Приглашаем на Java Jam — бесплатный митап ЮMoney для бэкенд-разработчиков 🔥

✅ 29 октября, четверг, 19:00 (мск) — приходите на митап в Санкт-Петербурге или смотрите трансляцию. 

Спикеры из ЮMoney и Сбера выступят с докладами:

🟣 Один апгрейд — больше сотни сервисов: как мы обновляем Java-стек в компании
Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления.

🟣 Как я автоматизировал свой проект — и всё сломал
Разберём, как выстроить автоматизацию в проекте с помощью ИИ и какие шишки можно набить на пути. Поговорим, как работает длинный контекст в моделях и как организовать работу с учётом этих особенностей.

🟣 Откатить нельзя оставить: мониторинг выкладки релиза на основе Sentry
Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате.

Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam👈

Читать полностью…

Java

Нет. Всех заменили нейросетями.

Читать полностью…

Java

Критическая уязвимость в Java: атака по сети без пароля и участия пользователя

Oracle опубликовала предупреждение CVE-2026-91403 с оценкой CVSS 9.1. Проблема находится в JSSE — компоненте Java, который обеспечивает защищённые соединения TLS.

По описанию Oracle, успешная атака может позволить читать, изменять и удалять данные, доступные уязвимому приложению. Для эксплуатации не нужны учётные данные, а сложность атаки оценена как низкая.

В списке затронутых версий:

- Java SE 8u511 / 8u511-perf, 11.0.33, 17.0.21, 21.0.13, 25.0.5 и 27.0.1.
- Oracle GraalVM for JDK 17.0.21 и 21.0.13.
- Oracle GraalVM Enterprise Edition 21.3.20.

Условия зависят от приложения: Oracle указывает на сценарии, где данные атакующего попадают в API уязвимого компонента, например через веб-сервис. Само наличие Java ещё не означает, что любой сервис можно атаковать.

Администраторам стоит проверить используемые сборки Java, включая runtime внутри контейнеров, и установить исправления по инструкции поставщика.

Предупреждение опубликовано 21 октября. Более ранние версии тоже могут быть затронуты — отсутствие в списке не подтверждает их безопасность.

https://www.oracle.com/security-alerts/alert-cve-2026-91403.html

Читать полностью…

Java

В 1996 вообще для работы хватало jdk 1.0.2 и для базы файлы db или dbf. 😁

Читать полностью…

Java

Что случилось мне блокировку?

Читать полностью…

Java

В то же время scala, как уже лет 15,: val msg = s“Player $name scored $score points”. 😁 Бедную java уже не знают как подогнать под современные реалии и с каждым разом это всё более похоже на франкинштейна, печаль.

Читать полностью…

Java

Хватит склеивать строки через плюс: как в Java собирать сообщения читаемо

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


String name = "Ada";
int score = 98;

// трудно читать, когда полей становится больше
String msg = "Player " + name + " scored " + score + " points";

// шаблон отдельно, значения отдельно
String msg2 = String.format("Player %s scored %d points", name, score);

// то же самое короче, Java 15+
String msg3 = "Player %s scored %d points".formatted(name, score);

// для локализации
String i18n = MessageFormat.format("Player {0} scored {1} points", name, score);


В String.format шаблон целиком виден сразу, а поля легко добавить или переставить, не трогая остальную строку. MessageFormat пригодится, когда тексты лежат в ResourceBundle и для разных языков порядок слов меняется: индексы {0} и {1} позволяют переставлять аргументы прямо в переводе.

У MessageFormat есть подвохи. Числа он форматирует по локали, поэтому 1234 превратится в "1,234". А одинарная кавычка там служебный символ, так что "don't" нужно писать как "don''t".

И про производительность: начиная с Java 9 конкатенация через + компилируется в invokedynamic и работает быстро, а String.format заметно медленнее, потому что каждый раз разбирает шаблон. В горячих циклах и логах на каждый запрос лучше оставить плюс или StringBuilder, а format использовать там, где важна читаемость.

Читать полностью…

Java

🍃 Не раскладывайте весь Spring-проект по папкам controller, service и repository.

В новом This Week in Spring Джош Лонг советует группировать код по функциональности, используя подход Spring Modulith. Например, orders, payments, users, внутри которых находятся относящиеся к ним слои.

Ещё в подборке:

• JobRunr 9: поиск упавшего шага и задач, вызывающих замедление, остановка выполнения без потери работы.
• Spring AI: разбор агентных паттернов и вызова инструментов от руководителя проекта Кристиана Цолова.
• Progen CLI: видео о генерации каркаса приложения.
• IntelliJ IDEA: обзор новых возможностей.
• A Bootiful Podcast: разговор с создателем Jenkins Косуке Кавагути.

https://spring.io/blog/2026/10/13/this-week-in-spring-october-13th-2026

#Java #SpringBoot

Читать полностью…
Subscribe to a channel