10986
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate. По всем вопросам @evgenycarter РКН clck.ru/3KoGeP
🧠 Spring Boot и медленные autowire — проверь, не зарыта ли у тебя бомба в @Configuration
Есть распространённый анти-паттерн: ты используешь @Configuration и внутри создаёшь бины с @Bean, а в этих методах — инжектишь зависимости через параметры. Всё выглядит красиво и «по фэншую»... но только на первый взгляд.
@Configuration
public class MyConfig {
@Bean
public MyService myService(SomeDep dep) {
return new MyService(dep);
}
@Bean
public SomeDep someDep() {
return new SomeDep();
}
}
SomeDep создаётся долго (например, подтягивает настройки из удалённого конфига, делает init-запрос в БД, или тянет секьюрити-контекст), это тормозит весь старт.@Bean -методы не видны как "инициализация", и кажется, что контекст тормозит "где-то ещё".@Lazy в нужных местах, особенно если bean тяжёлый или редко используется.@Configuration в пользу @Component + @Service, если это упрощает понимание.spring-boot-starter-actuator + --debug могут открыть глаза.
🧠 Spring Boot 3.2+: ускоряем стартап с помощью application.metrics.export.observation.enabled=false
Spring Boot 3.2 по умолчанию включает сбор Micrometer Observation метрик — даже если вы не используете Prometheus, Datadog и пр.
Это полезно, но часто избыточно — особенно в микросервисах, где важна скорость старта.
📌 Что это даёт?
- Отключает автоконфигурацию ObservationRegistry
- Убирает связанные Bean'ы
- Сокращает время старта до 30-60% (в зависимости от контекста)
💡 Как применить?
В application.yml или application.properties:
management:
metrics:
export:
observation:
enabled: false
.properties:
management.metrics.export.observation.enabled=false
Реальные проекты и нетворкинг с профи: Летняя школа бэкенд‑разработки Яндекса открыла набор
Начинающие бэкендеры, есть планы на лето? Если уже умеете писать читаемый код в Python, Java или C++ и разбираетесь в алгоритмах, Летняя школа бэкенда Яндекса — ваш шанс прокачаться в разработке высоконагруженных сервисов. Вы получите уникальный опыт, работая вместе с ведущими специалистами компании.
Как проходит обучение:
— со 2 июня по 27 июля — онлайн-лекции, семинары и практические задания
— с 28 июля по 24 августа — разработка реальных проектов офлайн или онлайн
Вас ждут:
— работа в фулстек-командах в коворкингах Яндекса
— лекции от специалистов компании в летнем лектории
— возможность стать частью команды и получить офер: больше половины выпускников становятся стажерами или сотрудниками компании
Школа бесплатная, но нужно пройти отбор. Отправляй заявку до 27 апреля!
Хотите глубже разобраться в функциональном программировании и писать более качественный код на Scala? Приходите на вебинар в Otus
24 апреля в 20:00 пройдёт открытый вебинар с Алексеем Воронцом — руководителем разработки в Naumen, 14 лет опыта, из них 9 лет на Scala. На практических примерах он покажет:
— почему Scala — функциональный язык
— как работать с ключевыми библиотеками
— как повысить выразительность кода
❗️ Если вы уже знакомы со Scala или только начинаете к нему присматриваться и хотите развивать функциональный подход в своих проектах — этот вебинар для вас.
Каждый участник:
— сможет задать вопросы эксперту
— получит скидку на полный курс по Scala-разработке
👉 Регистрируйтесь и сделайте свой код лучше
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🧠 Как ускорить загрузку контекста Spring Boot — простой приём
Если у вас тяжёлый Spring Boot-приложение с кучей конфигураций и бинов, время старта может легко вырасти до 20–30 секунд и больше. Сегодня покажу приём, который помогает ускорить cold start за счёт отключения ненужных автоматических конфигураций.
📌 Spring Boot автоконфигурация — это палка о двух концах.
Она упрощает старт, но часто тянет за собой кучу лишнего. Особенно если вы используете @SpringBootApplication, которая включает в себя @EnableAutoConfiguration.
💡 Решение — использовать spring.autoconfigure.exclude, чтобы явно выключить ненужное. Например:
# application.yaml
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
--debug или логгером org.springframework.boot.autoconfigure уровня DEBUG.exclude.@ImportAutoConfiguration с явным списком нужных автоконфигураций. Это тонкая настройка, идеально для библиотек и SDK.
💡 Ленивая инициализация бинов в Spring Boot — мощный инструмент ускорения старта
По умолчанию Spring инициализирует все singleton-бины при запуске приложения. Это может быть проблемой в больших проектах: старт медленный, а половина бинов не нужна сразу.
📌 Как ускорить старт и снизить потребление памяти? — Lazy Init!
✅ Глобально:
spring:
main:
lazy-initialization: true
@Component
@Lazy
public class HeavyBean {
public HeavyBean() {
System.out.println("HeavyBean init...");
}
}
@Lazy на зависимостях:
@Service
public class MyService {
public MyService(@Lazy HeavyBean heavyBean) {
this.heavyBean = heavyBean;
}
}
@Lazy на зависимостях, Spring всё равно создаст бин.@Scheduled, @EventListener), иначе они не сработают.
🧠 ThreadLocal — скрытая угроза утечек памяти
ThreadLocal — удобный способ хранить данные, привязанные к потоку. Например, для SimpleDateFormat или текущего пользователя в рамках запроса. Но с ним легко получить утечку памяти, особенно в thread pool'ах.
📌 Почему?
ThreadLocal-хранилище (Thread.threadLocals) живёт столько же, сколько поток. А потоки из пулов живут долго. Если ты забыл вызвать remove() — данные останутся в памяти навсегда.
Пример:
private static final ThreadLocal<UserContext> context = ThreadLocal.withInitial(UserContext::new);
public void handleRequest() {
try {
context.set(new UserContext("user123"));
// работа с контекстом
} finally {
context.remove(); // ОБЯЗАТЕЛЬНО!
}
}
remove()?UserContext останется висеть в ThreadLocalMap этого потока.UserContext содержит ссылки на другие объекты (например, HttpSession, EntityManager и т.д.) — вся эта цепочка не будет GC-шиться.remove() в finally.RequestScope или @ControllerAdvice вместо ThreadLocal.ThreadLocal, особенно в фильтрах и интерсепторах.
❓ Разработчики, интересуетесь стримингом, хайлоадом и видеотехнологиями?
⏰ 22 апреля на митапе VK Видео техлиды и топ-менеджеры расскажут, как, например, устанавливают CDN.
Если вы бэкендер, мобильный разработчик или работаете с ML — будет много полезных кейсов из продакшена и возможность задать вопросы тем, кто строит крупнейшую видеоплатформу.
🎯 Узнаете, как устроена архитектура VK Видео, как выстроены команды и какие задачи сейчас в приоритете.
👉Загляните под капот VK Видео
Остался всего 1 день, чтобы прокачать асинхронный код на Scala Future 📢
15 апреля в 18:30 пройдёт открытый вебинар с Валентином Шилиным — старшим программистом и аналитиком данных Deutsche Telekom IT GmbH, экспертом по большим данным и преподавателем курсов по Scala и Apache Spark. Он расскажет:
— как избегать типичных ошибок (блокировки и потерю контекста)
— как комбинировать асинхронные операции (Future.sequence, traverse, for-comprehensions)
— как ускорить и упростить написание кода на Scala
❗️ Если вы хотите перейти с Java на Scala или уже используете Play Framework, Akka или Spark — на вебинаре вы узнаете, как грамотно писать асинхронный код и устранять «подводные камни».
Каждый участник:
— сможет задать вопросы эксперту
— получит скидку на полный курс по Scala-разработке
👉 Не упустите шанс перейти на новый уровень — регистрируйтесь, остался 1 день
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🧠 @Value vs @ConfigurationProperties — кого выбрать?
Часто вижу, как даже опытные разработчики по привычке используют @Value для инъекции конфигурации:
@Value("${app.timeout}")
private Duration timeout;
@Value становится хрупким и неудобным.@ConfigurationProperties:
@ConfigurationProperties(prefix = "app")
public record AppProperties(Duration timeout, String apiKey) {}
@Bean
@ConfigurationPropertiesBinding
public AppProperties appProperties() {
return new AppProperties();
}
@ConfigurationProperties:@Validated, @NotNull, и т.д.)@EnableConfigurationProperties:
@Configuration
@EnableConfigurationProperties(AppProperties.class)
public class AppConfig {}
@Value — самое время навести порядок.
🧠 @Value в Spring — это ловушка, если вы используете списки или map'ы
Многие знают, что можно заинжектить список строк из application.yml вот так:
app:
langs:
- en
- fr
- de
@Value("${app.langs}")
private List<String> langs;
@Value не умеет парсить YAML-массивы. Он ожидает строку, и даже с CSV-строкой (en,fr,de) — всё не так очевидно: Spring не применяет ConversionService для списков.@ConfigurationProperties:
app:
langs:
- en
- fr
- de
@ConfigurationProperties(prefix = "app")
@Component
public class AppProps {
private List<String> langs;
// геттеры/сеттеры
}
List, Map, вложенными объектами;@Validated и @NotEmpty;@Value хорош для простых скаляров. Всё остальное — через @ConfigurationProperties.
🚀 Подпишись и прокачай свои скилы: лучшие каналы для IT-специалистов 👨💻📲
Папка с каналами для DevOps, Linux - Windows СисАдминов 👍
Папка с каналами для 1С программистов 🧑💻
Папка с каналами для C++ программистов 👩💻
Папка с каналами для Python программистов 👩💻
Папка с каналами для Java программистов 🖥
Папка с книгами для программистов 📚
Папка для программистов (frontend, backend, iOS, Android) 💻
GitHub Сообщество 🧑💻
/channel/Githublib Интересное из GitHub
Базы данных (Data Base) 🖥
/channel/database_info Все про базы данных
Разработка игр 📱
/channel/game_devv Все о разработке игр
БигДата, машинное обучение 🖥
/channel/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
QA, тестирование 🖥
/channel/testlab_qa Библиотека тестировщика
Шутки программистов 📌
/channel/itumor Шутки программистов
Защита, взлом, безопасность 💻
/channel/thehaking Канал о кибербезопасности
/channel/xakep_2 Хакер Free
Книги, статьи для дизайнеров 🎨
/channel/ux_web Статьи, книги для дизайнеров
Математика 🧮
/channel/Pomatematike Канал по математике
/channel/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак🙃
/channel/Excel_lifehack
Технологии 🖥
/channel/tikon_1 Новости высоких технологий, науки и техники💡
/channel/mir_teh Мир технологий (Technology World)
Вакансии 💰
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
/channel/rabota1C_rus Вакансии для программистов 1С
🦾 Тест по Java 🦾
📌Пройдите тест из 20 вопросов и проверьте, насколько вы готовы к обучению на углубленном курсе «Java Developer. Professional» от OTUS.
Сможете сдать - пройдете на курс по спеццене!
👩💻 В программе курса — все актуальные инструменты, необходимые Middle+ разработчику на Java. Возможна рассрочка.
🎁 Начните обучение со скидкой, подробности у менеджеров. ПРОМОКОД: JAVA_04
⏰ Время прохождения теста ограничено 30 минут
👉ПРОЙТИ ТЕСТ
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🎯 Как Java находит классы? Под капотом ClassLoader'ов
Сечас покажу вам одну из самых недооценённых тем в мире Java — механизм загрузки классов.
Когда ты запускаешь Java-приложение, оно не просто «видит» все классы. За кулисами работает цепочка загрузчиков:
1. Bootstrap ClassLoader
Самый базовый. Загружает классы из JDK (rt.jar, java.base, и так далее). На него даже нельзя получить ссылку в коде.
2. Platform ClassLoader (ранее Extension)
Загружает модули платформы (jmods), доступные из JDK, но не из java.base.
3. Application ClassLoader
Твой лучший друг. Он отвечает за загрузку классов из classpath (например, target/classes и lib/*.jar).
Но вот где начинается магия — ты можешь создать собственный ClassLoader и загружать классы в рантайме из файлов, БД или даже сети. Например:
ClassLoader customLoader = new URLClassLoader(new URL[]{new File("plugins/").toURI().toURL()});
Class<?> pluginClass = customLoader.loadClass("com.example.PluginImpl");
ClassCastException, даже если классы выглядят одинаково.
Понимание разницы между Error и Exception в Java ✅
Что такое Error в Java?
- Error (ошибка) в Java представляет собой серьёзные проблемы, которые программа не должна пытаться обрабатывать. Такие ошибки, как правило, генерируются виртуальной машиной Java (JVM) и указывают на сбои, не зависящие от кода программы — например, утечки памяти или переполнение стека.
Что такое Exception в Java?
- Exception (исключение) — это ситуации, которые программа может предсказать и обработать. Это ошибки, от которых можно восстановиться во время выполнения с помощью механизмов обработки исключений, таких как конструкции try-catch.
👉@BookJava
23 апреля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Илья Аров, старший разработчик в Т1, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Илья будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Илье
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2Vtzqvv6bu4
🧠 Lazy Initialization по-взрослому: не создавай проблемы на ровном месте
В Spring Boot часто можно встретить вот такую конструкцию:
@Service
public class EmailService {
private final SmtpClient client = new SmtpClient(); // дорогая инициализация
}
SmtpClient создаётся сразу при старте приложения. Даже если EmailService ни разу не вызовется. Это не только waste of resources, но и может сломать запуск, если SmtpClient требует специфического окружения.null-check, а красиво, безопасно и читаемо:Lazy<T> wrapper
@Component
public class EmailService {
private final Supplier<SmtpClient> client = Suppliers.memoize(SmtpClient::new);
public void sendEmail(...) {
client.get().send(...);
}
}
public class Lazy<T> {
private Supplier<T> supplier;
public Lazy(Supplier<T> supplier) {
this.supplier = () -> {
T value = supplier.get();
this.supplier = () -> value;
return value;
};
}
public T get() {
return supplier.get();
}
}
@Service
public class EmailService {
private final ObjectProvider<SmtpClient> client;
public EmailService(ObjectProvider<SmtpClient> client) {
this.client = client;
}
public void sendEmail(...) {
client.getObject().send(...);
}
}
Supplier, ObjectProvider или Lazy<T>.
🧠 Сейчас покажу баг, который легко пропустить при работе с @Transactional в Spring Boot 3+.
📌 Проблема — транзакция не работает, потому что метод вызывается изнутри того же класса.
Рассмотрим пример:
@Service
public class UserService {
@Transactional
public void createUser(User user) {
saveUser(user);
sendWelcomeEmail(user); // бросает исключение
}
public void saveUser(User user) {
userRepository.save(user);
}
}
sendWelcomeEmail выбросит исключение — транзакция не откатится, потому что @Transactional работает через прокси. Вызов createUser() должен идти извне, чтобы Spring "знал", что нужно обернуть вызов в транзакцию.
@Service
public class UserCreationService {
@Transactional
public void createUser(User user) {
// ...
}
}
@Autowired
private UserService self;
public void externalCaller(User user) {
self.createUser(user);
}
AopContext:
((UserService) AopContext.currentProxy()).createUser(user);
exposeProxy = true в @EnableAspectJAutoProxy.
🧠 Простое ускорение @Transactional методов в Spring Boot
Знаете, что @Transactional по умолчанию оборачивает метод в прокси?
Это значит:
- Внутренние вызовы в том же классе не проходят через транзакцию;
- Каждый такой прокси — это AOP-магия, которую можно обойти ради производительности.
📌 Если вы точно знаете, что метод будет вызываться только извне, и вам не нужна прокси-обёртка — используйте @Transactional на уровне интерфейса и включите interface-based proxy.
@Configuration
@EnableTransactionManagement(proxyTargetClass = false) // JDK proxy
public class TransactionConfig {
}
public interface UserService {
@Transactional
void createUser(User user);
}
@Transactional-методов.this.someMethod() внутри сервиса.proxyTargetClass = true на false даёт +3-5% к throughput.
👩💻 JDBC — ваш швейцарский нож для работы с данными
Приглашаем на открытый урок.
🗓 22 апреля в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional».
О чём поговорим:
✔️Основы JDBC: что это такое, зачем нужно и как работает
✔️Практические примеры выполнения сложных запросов
✔️Работа с транзакциями и обработка ошибок в JDBC
✔️ Оптимизация производительности при работе с данными через JDBC
Кому будет интересно:
Вебинар будет полезен разработчикам, инженерам по базам данных и архитекторам ПО, стремящимся улучшить навыки работы с базами данных и оптимизировать взаимодействие с данными.
В результате урока:
Вы научитесь эффективно использовать JDBC для работы с базами данных и сможете применять полученные знания в реальных проектах
🔗 Ссылка на регистрацию: https://vk.cc/cKRDCS
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
❓Сталкиваетесь с задачами, когда вам нужно выбрать лучший алгоритм, но не понимаете, как анализировать их сложность? Ваш код может быть медленным или неэффективным, и вы не знаете, как это исправить?
📗На открытом вебинаре 21 апреля в 20:00 мск вы освоите важные инструменты для анализа сложности алгоритмов, улучшите свой навык решения алгоритмических задач и на примере простых алгоритмов сортировки и увидите разницу при применении алгоритмов разной степени сложности.
➡️Регистрируйтесь прямо сейчас и получите скидку на большое обучение «C# Developer» по промокоду SHARP_SPEC_4: https://vk.cc/cKRCrB
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🧠 Как ускорить cold start Spring Boot приложения
Как можно сократить время старта Spring Boot 3+ приложения — без GraalVM и без магии.
📌 Используем флаг:
-Dspring.context.cache.applicationContext=true
@SpringBootTest);
🧠 Частая ловушка при работе с @Transactional в Spring
Сейчас покажу вам один распространённый анти-паттерн, который легко пропустить — вызов транзакционного метода внутри того же класса.
📌 Пример:
@Service
public class UserService {
@Transactional
public void registerUser(UserDto dto) {
saveUser(dto);
}
@Transactional
public void saveUser(UserDto dto) {
// сохранение пользователя
}
}
saveUser(), потому что вызов происходит внутри одного и того же бина — минуя прокси.@Transactional "срабатывает", только если метод вызывается извне, через прокси-объект.
@Service
public class UserSaver {
@Transactional
public void save(UserDto dto) {
// сохраняем
}
}
@Service
public class UserService {
private final UserSaver saver;
public UserService(UserSaver saver) {
this.saver = saver;
}
public void registerUser(UserDto dto) {
saver.save(dto);
}
}
TransactionTemplate вручную.@Transactional. Особенно при рефакторинге!
GRASP: почему настоящая архитектура начинается не с SOLID
Хочу начать с личной предыстории. Давным‑давно, как и многие из вас, я читал умные книжки: «Чистый код» и «Чистая архитектура» Роберта Мартина, «Совершенный код» Стива Макконнелла и другие.
Также не обошли меня и классические принципы проектирования — SOLID, KISS, DRY — и, думаю, каждый читатель добавит сюда свои.
Безусловно, это всё важные и фундаментальные вещи.
Но однажды на горизонте появилось DDD — предметно‑ориентированное проектирование в изложении Эрика Эванса. Именно его «синяя книга» стала культовой и задала язык для архитектурного мышления.
Позже я открыл и «красную книгу» Вона Вернона, где DDD уже рассматривался с точки зрения практической имплементации: архитектура, код, реальные подходы в проектах.
Читая Эванса, рассматривая его диаграммы классов и примеры кода, я всё думал: как он это делает?
https://habr.com/ru/articles/900140/
👉@BookJava
🛡Хотите строить защищенные и масштабируемые микросервисы с помощью ASP.NET Core?
Присоединяйтесь к открытому уроку 17 апреля в 20:00 МСК и узнайте, как создать безопасные микросервисы с использованием JWT, OpenID Connect, и .NET Aspire. Мы разберем, как защитить API, оптимизировать производительность и внедрить современные подходы к аутентификации и авторизации.
❗️Что разберем:
- Принципы и преимущества архитектуры микросервисов.
- Защиту API с использованием JWT и OpenID Connect.
- Инструменты .NET Aspire для оркестрации сервисов и настройки окружения.
- Реальные шаги по созданию микросервисов, настройке безопасности и работе с Docker.
🚀 Урок пройдет в преддверии старта курса «C# ASP.NET Core разработчик». 🎁 Все участники получат скидку на обучение по промокоду: ASP_NET_04.
Присоединяйтесь: https://vk.cc/cKOiH1
Промокод действителен до 28.04.2025
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🔍 Почему Optional — это не замена null везде и всегда
Привет! Сегодня хочу поделиться одной из часто встречающихся ошибок при использовании Optional в Java.
Многие разработчики, особенно начинающие, начинают использовать Optional везде, где может быть null, думая, что это автоматически делает код "безопасным". Но так ли это?
📌 Ключевая идея Optional — сигнализировать о возможном отсутствии значения в результате вызова метода.
А не заменять все поля и параметры на Optional.
Примеры плохой практики:
public class User {
private Optional<String> name; // ❌ Не нужно так делать
}
Optional — это не контейнер для полей.Optional вот так:
public Optional<User> findUserById(Long id) {
// Возвращаем Optional, потому что пользователь может не существовать
}
Optional — это про контракт на метод, а не про хранение данных.Optional в сигнатурах методов, когда результат может отсутствовать.Optional в полях и параметрах конструктора.Optional в проектах? Был ли опыт с его неправильным применением? Пиши в комментах👇
🧠 Как Java хранит boolean в памяти?
Сегодня я покажу вам, почему boolean в Java — это не просто true или false. А за этим простым типом скрывается интересный нюанс, особенно если ты задумываешься об экономии памяти.
В Java нет отдельного типа, который занимает всего 1 бит. Хотя логично было бы ожидать, что boolean — это один бит (true/false), на самом деле в памяти он занимает 1 байт (а иногда и больше, в зависимости от структуры объекта).
Пример:
public class Flags {
boolean flag1;
boolean flag2;
boolean flag3;
}
BitSet:
BitSet flags = new BitSet(3);
flags.set(0, true);
🔍 Как дебажить ClassLoader-проблемы в Java
В прошлом посте я рассказывал, как работает механизм загрузки классов в JVM. Сегодня разберём, как дебажить проблемы, которые возникают из-за загрузчиков. А это, между прочим, один из самых частых источников боли в больших проектах.
🧨 Типичная проблема:
ClassCastException: class com.example.MyClass cannot be cast to class com.example.MyClass
Class в JVM есть два признака уникальности:com.example.MyClass)ClassLoader)
System.out.println(myObject.getClass().getClassLoader());
ClassLoader.
-verbose:class
jvisualvm (вкладка "Class Loader")jconsole
❓ Java-разработчики, уже пробовали работать с асинхронным кодом через Scala Future?
⏰ 15 апреля в 18:30 на открытом вебинаре Валентин Шилин расскажет, как эффективно использовать Future в Scala: избегать ошибок (блокировки, потеря контекста), комбинировать асинхронные операции (Future.sequence, traverse, for-comprehensions) и улучшать производительность кода.
Валентин — старший программист и аналитик данных Deutsche Telekom IT GmbH, эксперт в обработке больших данных и преподаватель курсов по Scala и Apache Spark.
Если вы используете Java и хотите перейти на Scala, или уже работаете с Play Framework, Akka или Spark, — вебинар точно для вас. Научитесь грамотно писать асинхронный код, избегая типичных проблем.
🎁 Все участники смогут задать вопросы эксперту и получат скидку на полный курс по Scala-разработке.
👉 Регистрируйтесь и повысьте эффективность своей работы
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🧩 Nullable поля в Entity: угроза вашему приложению
Привет, друзья! Сегодня хочу поделиться одной ошибкой, которую часто встречаю в проектах — использование nullable = true в JPA-сущностях по умолчанию, без осознанного выбора.
Когда мы пишем:
@Column(name = "middle_name")
private String middleName;
NULLABLE.nullable = false, если поле обязано быть заполнено:
@Column(name = "email", nullable = false)
private String email;
@NotNull) — и не забывать включить её в контроллерах, сервисах, Hibernate.@Column(nullable = false), пока не докажете обратное.