#java #spring #kotlin
#java #spring #kotlin
Вопрос:
Я довольно новичок в kotlin, но уже много работал с java…
Я пытался использовать kotlin и java в одном проекте, но это выглядело очень некрасиво, и мне не понравилось, что мои классы были разделены на два места. Итак, теперь мой проект на 100% состоит из kotlin, и есть проблемы…
Я продолжаю получать это сообщение об ошибке:
lateinit property serviceX has not been initialized
Я понимаю, это означает, что сервис еще не инициализирован, но как мне тогда его инициализировать?
с Java и spring я сделал @Autowired или внедрил сервисы в конструктор и все было готово.
что мне нужно, так это чтобы мой REST мог использовать serviceX
@Component
@Path("/super")
open class SuperRest : BaseRest() {
@PUT
@Path("/test")
fun putTest(
@Context securityContext: SecurityContext,
@NotNull selected: String
) {
val user = serviceX(securityContext)
}
}
и в BaseRest я попытался автоматически подключить serviceX
во-первых, это было:
@Autowired
protected lateinit var serviceX: ServiceX
тогда это было просто
@Autowired
lateint var serviceX: ServiceX
затем я попробовал другие решения, которые я нашел в SO
open class BaseRest @Autowired constructor(
private val serviceX: ServiceX
) { ... }
Почему это?
Я все еще могу использовать другие сервисы @autowired в своем rest просто отлично.
Как только я попытаюсь использовать их из самого базового расширения, я получу
lateinit property serviceX has not been initialized
даже без какого-либо свойства lateinit я все равно каким-то образом получаю эту ошибку..
private var serviceX: ServiceX = ServiceX()
это все еще как-то не инициализировано, пожалуйста, помогите
Комментарии:
1. Можете ли вы показать место использования
serviceX
? Вероятно, вы обращаетесь к нему до его внедрения. Спасибо2. Вероятно, потому, что вы используете не Spring, а Jersey для управления своей конечной точкой rest и неправильно настроили интеграцию Jersey / Spring.
Ответ №1:
Не уверен, что понимаю
Как только я попытаюсь использовать их из самого базового расширения, я получу
часть, но вот код, с которым я столкнулся, и он работает нормально, как и ожидалось.
open class BaseRest {
@Autowired
protected lateinit var serviceX: ServiceX
fun baseFun() {
serviceX.serviceFun(SecurityContextImpl())
}
}
@Component
open class SuperRest : BaseRest() {
fun putTest(
securityContext: SecurityContext,
@NotNull selected: String
) {
baseFun()
val user = serviceX.serviceFun(securityContext)
}
}
Дополнительный вопрос: почему вы используете @PUT and @Path("/test")
аннотации, а не @PutMapping("/test")
нет?
Комментарии:
1. извините, не могу заставить его работать, даже с этим .. все еще не инициализирован
2. Хорошо, итак, вам нужно предоставить больше контекста. Например, ваш pom.xml Зависимости Spring и подробнее об этом «Только тогда, когда я пытаюсь использовать их из самого базового расширения». Кроме того, как упоминал @m-deinum, вы действительно используете Spring для управления вашей конечной точкой REST или что-то еще? это
@PUT and @Path
кажется подозрительным.