Когда Spring пытается соединить бин с открытым интерфейсом и частной реализацией , при использовании Spring Boot 2.0.2 возникает следующее исключение:
Caused by: java.lang.IllegalAccessException: Class
kotlin.reflect.jvm.internal.FunctionCaller$Constructor can not access a
member of class com.example.demo.MyCompImpl with modifiers "public"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102) ~[na:1.8.0_112]
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296) ~[na:1.8.0_112]
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288) ~[na:1.8.0_112]
at java.lang.reflect.Constructor.newInstance(Constructor.java:413) ~[na:1.8.0_112]
at kotlin.reflect.jvm.internal.FunctionCaller$Constructor.call(FunctionCaller.kt:66) ~[kotlin-reflect-1.2.41.jar:1.2.41-release-74 (1.2.41)]
at kotlin.reflect.jvm.internal.KCallableImpl.call(KCallableImpl.kt:107) ~[kotlin-reflect-1.2.41.jar:1.2.41-release-74 (1.2.41)]
... 22 common frames omitted
Это прекрасно работает с Spring Boot 1.5.9.
Ниже приведен пример кода, полный рабочий пример см. https://github.com/owyke/spring-private-components.
package com.example.demo
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.builder.SpringApplicationBuilder
import org.springframework.stereotype.Component
@SpringBootApplication
class DemoApplication
fun main(args: Array<String>) {
SpringApplicationBuilder(DemoApplication::class.java).run(*args)
}
interface ValueProvider {
fun provideValue(): Double
}
@Component
private class ValueProviderImpl(): ValueProvider {
override fun provideValue() = 3.1415
}
interface MyComp {
fun getValue(): Double
}
@Component
private class MyCompImpl(val provider: ValueProvider): MyComp {
override fun getValue() = provider.provideValue()
}