从 Kotlin 调用 JJWT 时出现 NoMethodError

Posted

技术标签:

【中文标题】从 Kotlin 调用 JJWT 时出现 NoMethodError【英文标题】:NoMethodError when calling JJWT from Kotlin 【发布时间】:2019-12-26 10:56:52 【问题描述】:

我正在 Kotlin 中开发一个小型 Spring Boot 应用程序,现在我想使用 JJWT 保护它。粗略地说,我正在将本教程翻译成我的用例:https://jakublesko.com/spring-security-with-jwt/

在项目中我有这个 AuthenticationFilter:

class JwtAuthenticationFilter(val authManager: AuthenticationManager) : UsernamePasswordAuthenticationFilter() 

    // other stuff omitted for brevity

    override fun successfulAuthentication(request: HttpServletRequest?, response: HttpServletResponse?, chain: FilterChain?, authResult: Authentication?) 
        val user = authResult?.principal as User

        val roles = user.authorities
                .stream()
                .map(GrantedAuthority::getAuthority)

        val signingKey = JWT_SECRET.toByteArray()

        val token = Jwts.builder()
                .signWith(SignatureAlgorithm.HS512, Keys.hmacShaKeyFor(signingKey))
                .setHeaderParam("typ", TOKEN_TYPE) // validate that "typ" does not actually mean "type"
                .setIssuer(TOKEN_ISSUER)
                .setAudience(TOKEN_AUDIENCE)
                .setSubject(user.username)
                .setExpiration(Date(System.currentTimeMillis() + 864000000))
                .claim("rol", roles)
                .compact()

        response?.addHeader(TOKEN_HEADER, TOKEN_PREFIX + token)
    

当我发布到应该发布令牌的身份验证 URL 时,我收到:

java.lang.NoSuchMethodError: io.jsonwebtoken.SignatureAlgorithm.getMinKeyLength()I at io.jsonwebtoken.security.Keys.hmacShaKeyFor(Keys.java:69) ~[jjwt-api-0.10.7.jar:na]

我可以调试successfulAuthentication 方法,看到它是用合理的参数调用的。引起我注意的是getMinKeyLength()I末尾括号后面的“我”。我的谷歌搜索技能显然不足以找到它存在的原因,但我强烈怀疑它与反射和从 Kotlin 代码调用 Java 库有关。

有谁可以告诉我如何解决这个问题?我已经猜不透了。

【问题讨论】:

JJWT 0.10.7 的 Keys.java 第 69 行只是一个标准(非反射)Java 方法调用:github.com/jwtk/jjwt/blob/0.10.7/api/src/main/java/io/…。我不知道为什么 Kotlin 会遇到问题 - 我希望我了解自己:/ 你能解决这个问题吗?运气好吗? 不幸的是,没有。 :// 我想知道它可能是什么 - 这是一个普通的 Java 调用,没有反射。 :// 这看起来像是依赖版本问题。请注意,您的“signwith()”的参数顺序与您的示例不同。使用该示例中的相同版本再次尝试 - '0.10.5'。 【参考方案1】:

我偶然发现了同样的问题。其原因很可能是依赖冲突。使用 jjwt 检查您是否有任何其他依赖项。对我们来说是com.twilio.sdk

你可以使用

mvn dependency:tree -Dverbose

确定冲突的依赖项后,您可以匹配您的 jjwt 版本或将其从依赖项中排除。

【讨论】:

【参考方案2】:

要从 Kotlin 运行 java 代码,请将 java 源代码放在文件夹下

主/java

另外,您的 kotlin 源代码位于 main/kotlin 下

【讨论】:

以上是关于从 Kotlin 调用 JJWT 时出现 NoMethodError的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 Kotlin 中的另一个活动访问 EditText 时出现空指针异常

使用从 Kotlin 数据类生成的代码时出现“不兼容的类型”错误

升级到 Kotlin 1.5.20 时出现谷歌地图问题

Android studio,构建kotlin时出现奇怪错误:生成错误代码

尝试创建 OkHttpClient 对象时出现 kotlin/TypeCastException

尝试访问 Kotlin 片段中的视图时出现 NullPointerException