Один аргумент типа, ожидаемый для функции интерфейса

#spring-boot #kotlin #generics #jjwt

#пружинный ботинок #kotlin #общие #jjwt

Вопрос:

Я следую руководству по реализации аутентификации JWT с помощью spring boot и java. Но в моем случае я хочу сделать это с Kotlin.

Я могу сгенерировать токен jwt, но у меня возникают проблемы при извлечении утверждений из токена jwt.

В этом руководстве есть общая функция для извлечения утверждений из токена.

 public <T> T extractClaim(String token, Function<Claims, T> claimsResolver {
    final Claims claims = extractAllClaims(token);
    return claimResolver.apply(claims);
}

private Claims extractAllClaims(String token) {
    return Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();
}

public String extractUsername(String token) {
    return extractClaim(token, Claims::getSubject);
}
 

Я написал это в kotlin следующим образом.

 fun <T> extractClaim(token: String, claimResolver: Function<Claims, T>): T {
    val claims = extractAllClaims(token)
    return claimResolver.apply(claims)
}

private fun extractAllClaims(token: String): Claims {
    return Jwts.parser().setSigningKey(key).parseClaimsJws(token).body
}

fun extractUsername(token: String): String {
    return extractClaim(token, Claims::getSubject)
}
 

Я получаю сообщение об ошибке от функции <Claims, T>, в котором говорится

Один аргумент типа, ожидаемый для функции интерфейса

Также я вижу, что есть и другие варианты, такие как KFunction и KFunction1.

У меня не так много опыта в Kotlin, и может кто-нибудь помочь мне разобраться в этой проблеме или предложить лучший способ сделать это.

Комментарии:

1. Вы импортируете правильный Function класс?

2. @gidds вы правы. Я импортировал неправильный класс. Теперь я изменил его на java.util.function. Функция. Но теперь я получаю требуемую функцию<Claims, TypeVariable<T>> но нашел KFunction1<Claims, String!> из метода extractUsername Claims::getSubject

Ответ №1:

Типы функций в Kotlin несколько отличаются, попробуйте использовать это:

 fun <T> extractClaim(token: String, claimsResolver: (Claims) -> T): T {
    val claims: Claims = extractAllClaims(token)
    return claimsResolver(claims)
}