#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)
}