Hibernate Validator 9.2: проверки паролей через аннотации
В первой бете Hibernate Validator 9.2 появились @PasswordStrength, @NotCompromised и @PasswordPolicy. Они позволяют проверять стойкость пароля, наличие в известных утечках и соблюдение набора правил.
В описании релиза есть важная подробность: готового оценщика стойкости и сервиса проверки утечек библиотека не предоставляет. Приложение подключает свои реализации PasswordStrengthEstimator и CompromisedPasswordChecker.
Все три ограничения считают null допустимым значением. Обязательное поле нужно дополнительно пометить @NotNull или @NotBlank.
PasswordPolicy объединяет правила в повторно используемый класс. Каждое нарушенное правило создаёт собственную ошибку валидации, поэтому можно показать, какие требования не выполнены.
Это бета; многие новые API ещё экспериментальные. Примеры подключения сервисов в статье стоит рассматривать как основу для знакомства с интерфейсами.
Почему javac разрешает удалить Integer из Set<Short>
Метод remove(Object) принимает любой объект. Поэтому такой код компилируется, но оставляет элемент в коллекции:
Set<Short> values = new HashSet<>();
values.add((short) 1);
values.remove(1);
В последней строке 1 упаковывается в Integer. В наборе лежит Short, и равными эти объекты не считаются.
В разборе Error Prone показано, как находить подобные ошибки при компиляции. Инструмент подключается к javac и использует сведения о типах: проверка CollectionIncompatibleType замечает несовместимый аргумент коллекции.
Другой пример — YYYY вместо yyyy в формате даты: год недели может отличаться от календарного в конце декабря. Проверка MisusedWeekYear помогает поймать и эту ошибку. Для правил своей команды можно написать BugChecker, а повторяющиеся замены описать Java-шаблонами Refaster.
В JavaDoc предлагают отдельный тег для предупреждений
Совет по использованию метода или важное ограничение легко потерять внутри длинного описания. Для JDK 28 предлагают тег @note, который выделяет такие фрагменты при генерации документации.
В заметке OpenJDK Quality Outreach показаны два варианта: встроенная заметка с вертикальной полосой и блочная с отдельным заголовком. Заголовок можно изменить, например на Caution:
Атрибуты kind и id позволяют добавить CSS-класс и идентификатор HTML-элемента. Предложение также предусматривает настройку собственных тегов через параметры javadoc.
Пока это предлагаемые изменения для JDK 28. Пример полезен для знакомства с будущим форматом; использовать его как поддерживаемый синтаксис в документации проекта на JDK 27 рано.
JDK 27 поддерживает гибридный обмен ключами: группа X25519MLKEM768 объединяет классическую кривую X25519 и постквантовый алгоритм ML-KEM. Она включена по умолчанию, но для её использования поддержку должны иметь обе стороны соединения.
В обзоре Java Security Sean Mullan объясняет и другие изменения TLS. Цепочки сертификатов теперь могут передаваться со сжатием zlib, а редко используемые группы ffdhe6144 и ffdhe8192 убраны из списка по умолчанию.
Для настройки групп есть свойство jdk.tls.namedGroups и метод SSLParameters.setNamedGroups(). Удалённые из стандартного списка группы можно явно включить, если они нужны для совместимости.
При переходе стоит проверить соединения с реальными клиентами и серверами. Поддержка новой группы в JDK ещё не означает, что каждое соединение её согласует: результат зависит и от возможностей второй стороны.
Lathe: конфигурация редактора из реальной Maven-сборки
Maven собирает проект, а редактор подчёркивает рабочий код как ошибочный. Причина может быть в разных представлениях о module path, зависимостях или обработчиках аннотаций.
Alexey Gavrilov предлагает Java language server Lathe. Расширение Maven записывает параметры компиляции и тестов из самой сборки. Сервер читает этот снимок, чтобы настроить подсказки, диагностику, запуск и отладку. Следующая сборка обновляет конфигурацию.
Для первого захвата после подключения расширения используется:
mvn clean test -Dlathe.capture.only=true
Папку .lathe/ автор рекомендует добавить в .gitignore. Запуски и тесты затем воспроизводятся по сохранённым настройкам без нового вызова Maven.
Нужны Java 21+ и Maven 3.x. Проект пока молодой: наиболее полный клиент есть для Neovim, Emacs работает через Eglot, поддержка VS Code находится в планах.
Как собрать Swing-приложение без JVM у пользователя
Quarkus Desktop помогает собрать приложение на AWT или Swing в нативный исполняемый файл. Расширение регистрирует необходимые классы, ресурсы и JNI-вызовы для GraalVM, а библиотеки JDK размещает рядом с бинарником.
В руководстве автора окно становится CDI-компонентом. Оно получает зависимости через @Inject и открывается по DesktopStartupEvent в потоке обработки событий Swing — EDT.
Долгие операции выполняют в фоновом executor, а обновление интерфейса возвращают на EDT через EdtExecutor. Для окон подходят области @Singleton и @Dependent: обычный CDI-прокси для Swing-компонента создаёт проблемы.
Нативная сборка выполняется под целевую ОС. Для macOS нужны Quarkus 4.0 и GraalVM 25.1 или новее; на Windows arm64 доступен режим JVM. Динамически загружать неизвестные при сборке классы в нативном приложении нельзя.
Java в браузере: редактировать, компилировать, запускать
В учебном примере удобно поменять строку Java и сразу увидеть результат. Petr Pravda показывает приложение на React и Vite, в котором компиляция выполняется на устройстве читателя.
TeaVM преобразует Java-байткод в JavaScript или WebAssembly. Чтобы пользователь мог менять исходник, автор добавляет teavm-javac: Java-компилятор тоже работает в браузере. Web Worker получает код, компилирует его и возвращает результат странице, сохраняя отзывчивость редактора.
В демо есть отдельные кнопки Compile Java и Run Java. Программа считает простые числа, рисует небольшой фрактал и показывает доступные системные свойства. Запрос к серверу для компиляции не нужен.
Среда отличается от обычной JVM: доступна часть стандартной библиотеки, а код с JNI, динамической загрузкой классов и произвольной рефлексией потребует изменений. Доступа к файлам и переменным оболочки посетителя тоже нет.