从 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 数据类生成的代码时出现“不兼容的类型”错误
Android studio,构建kotlin时出现奇怪错误:生成错误代码