Spring Boot @Autowired с Kotlin в @Service всегда имеет значение null

В настоящее время я пытаюсь переписать приложение загрузки Java Spring Boot с Kotlin. Я столкнулся с проблемой, что во всех моих классах, которые аннотируются с помощью @Service инъекция зависимостей работает некорректно (все экземпляры равны null ). Вот пример:

 @Service @Transactional open class UserServiceController @Autowired constructor(val dsl: DSLContext, val teamService: TeamService) { //dsl and teamService are null in all methods } 

Выполнение этого же в Java работает без проблем:

 @Service @Transactional public class UserServiceController { private DSLContext dsl; private TeamService teamService; @Autowired public UserServiceController(DSLContext dsl, TeamService teamService) { this.dsl = dsl; this.teamService = teamService; } 

Если я комментирую компонент с @Component в Котлине, все работает отлично:

 @Component open class UserServiceController @Autowired constructor(val dsl: DSLContext, val teamService: TeamService) { //dsl and teamService are injected properly } 

Google предоставил много разных подходов для Kotlin и @Autowired которые я пробовал, но все они привели к тому же NullPointerException Я хотел бы знать, какова разница между Kotlin и Java и как я могу это исправить?

Какую версию Spring Boot вы используете? Поскольку 1.4 Spring Boot основан на Spring Framework 4.3, и с тех пор вы должны иметь возможность использовать @Autowired конструктора без какой- @Autowired аннотации @Autowired . Вы пробовали это?

Это будет выглядеть так и работает для меня:

 @Service class UserServiceController(val dsl: DSLContext, val teamService: TeamService) { // your class members } 

Я просто столкнулся с точно такой же проблемой – инъекция работала хорошо, но после добавления аннотации @Transactional все поля с автоопределением равны нулю.

Мой код:

 @Service @Transactional open class MyDAO(val jdbcTemplate: JdbcTemplate) { fun update(sql: String): Int { return jdbcTemplate.update(sql) } } 

Проблема здесь в том, что методы окончательны по умолчанию в Kotlin, поэтому Spring не может создать прокси для класса:

  osaop.framework.CglibAopProxy: Unable to proxy method [public final int org.mycompany.MyDAO.update(... 

«Открытие» метода устраняет проблему:

Фиксированный код:

 @Service @Transactional open class MyDAO(val jdbcTemplate: JdbcTemplate) { open fun update(sql: String): Int { return jdbcTemplate.update(sql) } } 
Intereting Posts
Kotlin прямой доступ к Button в android.support.v4.app.Fragment ссылка на нулевой объект Пользовательский Glide ModelLoader для изображений base64 Предупреждение компилятора при использовании аннотации @Value в проекте Kotlin Список загруженных файлов равен нулю. String to Double на Android / Kotlin Как изменить имя свойства Kotlin в соответствии с полем в базу данных Firebase Как реализовать dropWhile рекурсивно с помощью foldRight в Котлине Почему Smartcast не работает после nullcheck Kotlin: Как я могу позволить Android Studio реализовать интерфейс в нижней части класса Котлин: ссылка на метод не работает? Вытягивание данных из API с помощью okHTTP и GSON Почему экземпляр $ MockitoMock $ не идентифицируется как макет? Завершить деятельность андроида от другого с помощью Kotlin Присвоение не допускается при выражении? В android kotlin, используя библиотеку степпера, передавая пользовательские значения переключателей по нескольким фрагментам, которые будут использоваться на сводной странице