Resources. Errors. Validation.

Предполагаю, что у вас будет в работе два проекта для преобразования - один мой, референсный и один ваш, собственный.
Для глубокого погружения в Kotlin рекомендуется проделывать преобразование саму, глядя на мой код. В конце рекомендуется сравнивать получившийся код с моим (например через Compare by Clipboard).
Скачайте патч в референсный проект (в корень или сделать подкаталог patch)
и правой кнопкой мыши -> Apply 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, копируем класс с преобразованием прямо сюда, ниже аннотации.
    Делаем везде, где возможно, реализацию методов в одну строку и тип возвращаемого значения, если он очевиден или неважен, опускаем.
> Base interfaces. Transfer Objects. Entities