Resources. Errors. Validation.
Предполагаю, что у вас будет в работе два проекта для преобразования - один мой, референсный и один ваш, собственный.
Для глубокого погружения в Kotlin рекомендуется проделывать преобразование саму, глядя на мой код. В конце рекомендуется сравнивать получившийся код с моим (например через Compare by Clipboard).
Для глубокого погружения в Kotlin рекомендуется проделывать преобразование саму, глядя на мой код. В конце рекомендуется сравнивать получившийся код с моим (например через Compare by Clipboard).
Скачайте патч в референсный проект (в корень или сделать подкаталог patch)
и правой кнопкой мыши -> Apply Patch
и правой кнопкой мыши -> Apply Patch
Apply patch 2_resources_error_validation.patch
Resources
Копируем из Java проекта в наш без изменений src/main/resources (кроме data.sql, добавим его, когда будут генерироваться таблицы) и src/test/resources
- Если требуется, меняем в application.yaml имя БД и пакета в логировании
- Удаляем ненужный application.properties
Errors
Преобразовывать классы Java в Kotlin в IDEA можно через конвертацию (Ctrl+Alt+Shift+K)
или просто копируя Java код в Kotlin класс. После этого обычно требуется ручные правки.
В Kotlin в одном файле можно создавать несколько публичных классов, поэтому, если классы небольшие,
связанные между собой и их в проекте будет ограниченное количество, их помещяют в один общий с
обопщающим названием. Для наших AppException-ов создаем (Alt+Ins на
пакете) Kotlin файл AppExceptions
и по очереди копируем в него все классы исключений,
начиная с AppException
и соглашаясь на конвертацию.
- При копировании втрого класса видим ошибку: This type is final, so it cannot be inherited from.
Наследовать можно только открытые и абстрактные классы,
а по умолчанию Kotlin классы
final
. ДелаемAppException
открытым:open class AppException
- В Kotlin приходится заранее думать про Nullable and non-nullable types.
Обяжем наши эксепшены создавать с не-нулевые сообщением, для этого поменяем в конструкторе
msg: String?
наmsg: String
Чтобы не пропустить ошибку, после конвертации можно сначала убрать все Nullable? типы
и затем добавлять"?"
только там, где он действительно требуется. Аннотация@NonNull
не нужна. - Копируем оставшиеся исключения и сверяем полученный результат с
AppExceptions.kt
после применения патча. Обратите внимание, что нам не нужен !! operator принудительного преобразования нулевого типа в ненулевой. - Класс
ErrorType
копируем в проект и преобразуем через Ctrl+Alt+Shift+K, здесь правки не требуются
Validation
- Добавляем в build.gradle.kts зависимости spring-boot-starter-validation и jsoup. Kts является расширением для Kotlin скриптов и для формирования зависимости с версией jsoup мы используем String templates - очень удобную фичу вставки значений прямо в строку
- В последнем занятии проекта BootJava я сделал Update / Fix / Refactoring, в частности перенес
NoHtml/NoHtmlValidator
на уровень выше, в корневой подпакетvalidation
, аutil.validation.ValidationUtil
переименовал/перенес вweb.RestValidation
(его мы конвертируем позже). КопируемNoHtml
в корневой подпакетvalidation
с преобразованием. Обычно, для улучшения читаемости и минимизации ошибок, если в конструкторае Kotlin несколько параметров, их принято распологать в отдельной строке: ставим курсор на любой из параметров и делаем Alt+Enter->Put parameters on separate lines. Ошибка сPayload
связана с тем, что должен быть non-nullable type:KClass<out Payload>
. Оставляем только нужные нам@Target
- поля классов и параметры в контроллерах. - Класс
NoHtmlValidator
неотрывен отNoHtml
, копируем класс с преобразованием прямо сюда, ниже аннотации.Делаем везде, где возможно, реализацию методов в одну строку и тип возвращаемого значения, если он очевиден или неважен, опускаем.