Что вызывает это несоответствие между Spring boot 1.5.9 и 2.0.2, и как это можно исправить? - PullRequest
0 голосов
/ 17 мая 2018

Когда 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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...