Study - dev, blog archive, як в spring написати валідатор, який використовує коди повідомлень, і не

Введення в суть питання

Я продовжую викладати на загальний огляд ряд своїх утіліток допомагають і спрощують розробку. Сьогодні я розповім про інструмент, який напевно стане в нагоді всім тим хто користується spring. Припустимо що ви створюєте деякий контролер, наприклад, такий:

Як бачите тут я задекларував, що вхідним параметром до контролера буде клас "blz.model.dto.LoginDTO". Для перевірки того поля в формі були вказані вірно, без помилок, в spring використовується validator, на прикладі це, blz.model.dto.validators.ValidateLoginDTO.

Сам код класу валідатора може виглядати приблизно так:

Основна увага на виклик методу "ValidationUtils.rejectIfEmptyOrWhitespace". Тут я перевіряю всередині вхідного об'єкта-комманди умова, таке щоб значення поля email і пароль були заповненими. У разі якщо це не так, то в об'єкт Errors поміщається код помилки "validation.failed.noemail.for.login" і "validation.failed.nopass.for.login".

Ці коди беруться з нізвідки: я повинен створити файл properties, наприклад, "/WEB-INF/localization/register_and_login.properties" і помістити в нього наступний текст:

Це ще не все, тепер останній крок - реєстрація ресурсів всередині контексту spring:

Треба сказати що подібний багатокроковий процес мене сильно дратує тому сприяє появі помилок в основному через неакуратність або поспіху (ну-ну, хіба може бути інакше?). Незважаючи на це змінити кроки, прибрати, поміняти місцями не можна, тому що нічого кращого не придумується, а якщо навіть і придумається то навряд чи цей самокат буде плавно входити в загальну систему spring. Однак це не означає, що не можна спростити для себе улюбленого процес перевірки наявності в файлу властивостей потрібних для роботи валідаторів кодів повідомлень. Для цього я вирішив додати підтримку спеціальної інструкції. Ось її код:

Тепер я повернуся до файлу валідатора і трохи його перепишу:

Як бачите змін небагато: на самому початку файлу я виконав маркування класу валідатора як використовує коди повідомлень розташовані всередині ResourceBundle з базовим ім'ям "/ WEB-INF / localization / register_and_login". Вказав для яких локалей необхідно виконати сканування, і вказав кодування файлу з ресурсами (справа в тому, що рідні для java ResourceBundle завантажують дані з файлів в кодуванні ISO8859-1, а для spring можна явно вказати кодування, наприклад, windows-1251 і це набагато зручніше ніж мучитися з утилітою native2ascii.exe).

Всі поля зберігають в собі значення коду повідомлення я промарковані анотацією "@ ValidationBundle.Marker".

Тепер є два варіанти як запустити перевірку spring-контексту і ваших класів на коректність. По-перше, і це найбільш зручний для мене спосіб це створити ant-скрипт, частиною якого є створення звіту про знайдені помилки. Для цього я створив ant-скрипт.

Після запуску сценарію я отримаю такий html-звіт:

Study - dev, blog archive, як в spring написати валідатор, який використовує коди повідомлень, і не

Треба сказати, що зовнішній вигляд звіту можна гнучко налаштовувати: в файлах з кодами проекту ви знайдете velocity-шаблон для вихідного звіту (якщо ви не знаєте що таке velocity, то скоро я опублікую серію статей присвячену йому).

Тепер про другий варіант використання. В цьому випадку в контекст spring додається новий bean, який зареєстрований в разі отримання події "Контекст оновлений" виконати його сканування і сформувати звіт.

При запуску контексту, автоматично буде викликаний цей bean, який і сформує html-файл зі звітом.

В якості єдиного параметра до конструктору потрібно передати шлях до файлу, куди буде поміщений сформований html-звіт про знайдені помилки. У разі якщо шлях не абсолютний, а відносний (не почалась з file :), то потрібно якимось чином повідомити про "базі" файлу. Клас біна (AnnoBean) реалізує інтерфейс ServletContextAware. А значить що якщо все пішло добре то йому повідомлять про місцезнаходження кореня веб-додатки і відносний шлях буде відраховуватися від нього.

Хоча код утиліти заточений під роботу з валідаторами, проте досить легко можна її перебудувати і навчити виконувати перевірки наявності кодів повідомлень для довільний spring-бінов.

Схожі статті