【问题标题】:One type argument expected for interface Function <out R>接口 Function <out R> 需要一种类型参数
【发布时间】:2021-03-15 02:52:09
【问题描述】:

我正在关注 tutorial 以使用 spring boot 和 java 实现 JWT 身份验证。但就我而言,我想用 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)
}

我收到了一个来自 Function 说的错误

接口函数需要一个类型参数

我还可以看到还有其他选项,例如 KFunctionKFunction1

我在 Kotlin 方面没有多少经验,有人可以帮我解决这里的问题或提出更好的解决方法。

【问题讨论】:

  • 你在导入正确的Function类吗?
  • @gidds 你是对的。我正在导入错误的课程。现在我将其更改为 java.util.function.Function。但是现在我得到了 Required Function> but Found KFunction1 from extractUsername method Claims::getSubject

标签: spring-boot kotlin generics jjwt


【解决方案1】:

Kotlin 中的函数类型有些不同,试试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-06
    • 2021-06-12
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2018-02-09
    相关资源
    最近更新 更多