Currently I try to rewrite my Java Spring Boot Application with Kotlin. I encountered a problem that in all of my classes which are annotated with @Service
the depe
I faced the same problem working with Kotlin but the null instance was a JpaRepository. When I added the @Transactional
annotation to a method inside a service, I got a message saying Methods annotated with '@Transactional' must be overridable
so I went ahead and marked both, the class and the method as open
. Easy, right?! Well, not quite.
Although this compiles, I got the required repository as null at execution time. I was able to solve the problem in two ways:
open
:open class FooService(private val barRepository: BarRepository) {
open fun aMethod(): Bar {
...
}
@Transactional
open fun aTransactionalMethod(): Bar {
...
}
}
This works but having all the methods in a class marked with open
might look a bit odd, so I tried something else.
interface IFooService {
fun aMethod(): Bar
fun aTransactionalMethod(): Bar
}
open class FooService(private val barRepository: BarRepository) : IFooService {
override fun aMethod(): Bar {
...
}
@Transactional
override fun aTransactionalMethod(): Bar {
...
}
}
This way you can still use the annotation since all the methods will be overridable and you won't need to use open
everywhere.
Hope this helps =)