作为Springbean的Kotlin内部类

作为Springbean的Kotlin内部类,spring,kotlin,inner-classes,spring-bean,Spring,Kotlin,Inner Classes,Spring Bean,我将Kotlin与Spring boot一起使用,在创建bean时遇到了一些错误 在spring框架类中,错误消息是索引0超出长度0的界限 我不明白为什么会导致这个java代码出现异常(spring) for(int-paramIndex=0;paramIndexKParameter.Kind.VALUE.equals(p.getKind())) .collect(收集器.toList()) .get(索引); 返回(parameter.getType().isMarkedNullable()|

我将Kotlin与Spring boot一起使用,在创建bean时遇到了一些错误

在spring框架类中,错误消息是索引0超出长度0的界限

我不明白为什么会导致这个java代码出现异常(spring)

for(int-paramIndex=0;paramIndex
可能吗

无论如何,我想知道如何使用属性值(
@ConfigurationProperties
)将Springbean创建为kotlin内部类

我的代码 多谢各位。对不起,我的英语不好。

这似乎是一个错误

根本原因已解释为:

如果(函数!=null){
列表参数=function.getParameters();
KParameter参数=参数
.stream()
.filter(p->KParameter.Kind.VALUE.equals(p.getKind()))
.collect(收集器.toList())
.get(索引);
返回(parameter.getType().isMarkedNullable()| | parameter.isoOptional());
}
DependencyDescriptor
中检查所需的构造函数参数时,上面的语句会过滤掉参数0,该参数是对外部类的引用,并且具有实例的种类值

然后,它尝试根据初始输入索引访问参数,但流已被过滤为空

编辑

但是,嵌套类是受支持的,并按预期工作。
nested
类是在类中定义的类,在kotlin中没有修饰符,在java中没有
static
修饰符。另一方面,
内部
类是在类内部定义的类,在kotlin中有
内部
修饰符,而在java中没有修饰符。

这似乎是一个错误

根本原因已解释为:

如果(函数!=null){
列表参数=function.getParameters();
KParameter参数=参数
.stream()
.filter(p->KParameter.Kind.VALUE.equals(p.getKind()))
.collect(收集器.toList())
.get(索引);
返回(parameter.getType().isMarkedNullable()| | parameter.isoOptional());
}
DependencyDescriptor
中检查所需的构造函数参数时,上面的语句会过滤掉参数0,该参数是对外部类的引用,并且具有实例的种类值

然后,它尝试根据初始输入索引访问参数,但流已被过滤为空

编辑


但是,嵌套类是受支持的,并按预期工作。
nested
类是在类中定义的类,在kotlin中没有修饰符,在java中没有
static
修饰符。另一方面,
内部
类是在类内部定义的类,在kotlin中有
内部
修饰符,在java中没有修饰符。

为什么
@Configuration
内部类可以工作,而不是
@组件
内部类?我认为
@Configuration
也是
@Component
:为什么
@Configuration
内部类可以工作,而不是
@Component
内部类?我认为
@配置
也是
@组件

// application.yml
naver:
  clientId: ...
  clientSecret: ...
  grantType: authorization_code
  redirectUri: ...
  accessTokenUrl: ...
  profileUrl: ...

// some codes
abstract class OAuth2Provider {
  lateinit var clientId: String
  lateinit var clientSecret: String
  lateinit var grantType: String
  lateinit var redirectUri: String
  lateinit var accessTokenUri: String
  lateinit var profileUri: String

  fun callback(code: String) = getProfiles(getAuthenticationResult(code))
  abstract fun getAuthenticationResult(code: String): AuthenticationResult
  abstract fun getProfiles(result: AuthenticationResult): Map<String, String>
}

@Component
class Providers(
  val restTemplate: RestTemplate
) {

  private fun createOauth2LoginParams(grantType: String, clientId: String, code: String): MultiValueMap<String, String> {
    val map = LinkedMultiValueMap<String, String>()
    map.add("grant_type", grantType)
    map.add("client_id", clientId)
    map.add("code", code)
    return map
  }

  private fun createOauth2HttpEntity(map: MultiValueMap<String, String>): HttpEntity<MultiValueMap<String, String>> {
    val headers = HttpHeaders()
    headers.contentType = APPLICATION_FORM_URLENCODED
    return HttpEntity(map, headers)
  }

  private fun createAuthenticationResult(url: String, entity: HttpEntity<MultiValueMap<String, String>>): AuthenticationResult {
    return restTemplate.postForObject(url, entity, AuthenticationResult::class.java)!!
  }

  private fun createProfileResponseEntity(url: String, result: AuthenticationResult): ResponseEntity<Map<*, *>> {
    val headers = HttpHeaders()
    headers.add("Authorization", result.tokenType + " " + result.accessToken)
    headers.contentType = MediaType.APPLICATION_FORM_URLENCODED

    val entity = HttpEntity<MultiValueMap<String, String>>(headers)
    return restTemplate.exchange(url, HttpMethod.GET, entity, Map::class.java)
  }

  @ConfigurationProperties("naver")
  @Component
  inner class Naver : OAuth2Provider() {

    override fun getAuthenticationResult(code: String): AuthenticationResult {
      val map = createOauth2LoginParams(grantType, clientId, code)
      map.add("client_secret", clientSecret);

      val entity = createOauth2HttpEntity(map)
      return createAuthenticationResult(accessTokenUri, entity)
    }

    override fun getProfiles(result: AuthenticationResult): Map<String, String> {
      val resultEntity = createProfileResponseEntity(profileUri, result)
      val body = resultEntity.body!!

      val uniqueId = body.get("id").toString()
      val imageUrl = body.get("profile_image").toString()

      val profiles = HashMap<String, String>()
      profiles["uniqueId"] = uniqueId
      profiles["imageUrl"] = imageUrl
      return profiles
    }
  }

}
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.mubeeplayer.api.oauth2.Providers$Naver': Unexpected exception during bean creation; nested exception is java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
...
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:705) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1341) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1187) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) ~[spring-beans-5.1.7.RELEASE.jar:5.1.7.RELEASE]
if (function != null) { 
    List<KParameter> parameters = function.getParameters(); 
    KParameter parameter = parameters
        .stream()
        .filter(p -> KParameter.Kind.VALUE.equals(p.getKind()))
        .collect(Collectors.toList()) 
        .get(index); 
        return (parameter.getType().isMarkedNullable() || parameter.isOptional()); 
}