Kotlin автоматически подключен весной

#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 кажется подозрительным.