java.lang.AbstractMethodError:当我尝试使用 nexmo(vonage) API 发起出站语音呼叫时出现此异常

问题描述

我所有相关依赖项的 pom.xml。没有其他依赖项在内部使用以下依赖项。

<dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.9</version>
    </dependency>
<dependency>
      <groupId>com.sparkjava</groupId>
      <artifactId>spark-core</artifactId>
      <version>2.6.0</version>
    </dependency>
    <dependency>
      <groupId>com.vonage</groupId>
      <artifactId>client</artifactId>
      <version>6.0.0</version>
    </dependency>

    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-api</artifactId>
      <version>0.11.0</version>
    </dependency>
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-impl</artifactId>
      <version>0.11.0</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-jackson</artifactId>
      <version>0.11.0</version>
      <scope>runtime</scope>
    </dependency>
<dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.9.1</version>
    </dependency>

使用 vonage SDK 发起出站语音呼叫的 Java 代码

VonageClient client = VonageClient.builder().applicationId(APPLICATION_ID).privateKeyContents(PRIVATE_KEY).build();
    
Ncco ncco = new Ncco(TalkAction.builder(MESSAGE).voiceName(VOICE_TYPE).build());
CallEvent callEvent=client.getVoiceClient().createCall(newCall(TO_NUMBER,FROM_NUMBER,ncco));

执行代码时抛出异常。

java.lang.AbstractMethodError:接收器类 io.jsonwebtoken.impl.DefaultJwtBuilder 没有定义或继承 解析方法'抽象的实现 io.jsonwebtoken.JwtBuilder signWith(java.security.Key,io.jsonwebtoken.SignatureAlgorithm)' 的接口 io.jsonwebtoken.JwtBuilder。 在 com.nexmo.jwt.JwtGenerator.generate(JwtGenerator.kt:49) ~[jwt-1.0.1.jar:?] 在 com.nexmo.jwt.Jwt.generate(Jwt.kt:44) ~[jwt-1.0.1.jar:?] 在 com.nexmo.jwt.Jwt.generate$default(Jwt.kt:43) ~[jwt-1.0.1.jar:?] 在 com.nexmo.jwt.Jwt.generate(Jwt.kt) ~[jwt-1.0.1.jar:?] 在 com.vonage.client.auth.JWTAuthMethod.apply(JWTAuthMethod.java:43) ~[client-6.0.0.jar:6.0.0] 在 com.vonage.client.AbstractMethod.applyAuth(AbstractMethod.java:127) ~[client-6.0.0.jar:6.0.0] 在 com.vonage.client.AbstractMethod.execute(AbstractMethod.java:73) ~[client-6.0.0.jar:6.0.0] 在 com.vonage.client.voice.CallsEndpoint.post(CallsEndpoint.java:57) ~[client-6.0.0.jar:6.0.0] 在 com.vonage.client.voice.VoiceClient.createCall(VoiceClient.java:61) ~[client-6.0.0.jar:6.0.0] 在 com.senpiper.core.listener.VoiceCallListener.listen(VoiceCallListener.java:37) ~[班级/:?] 在 jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?] 在 jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?] 在 jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?] 在 java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]

解决方法

问题是参考:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>        
</dependency>

删除此依赖项将解决您的问题。这个包被前面的三个包所取代,它们是同一个包的模块化版本,见 v0.10.0 release notes for details 来自您的 POM 文件的以下内容就足够了:

<dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-api</artifactId>
      <version>0.11.0</version>
</dependency>
<dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-impl</artifactId>
      <version>0.11.0</version>
      <scope>runtime</scope>
</dependency>
<dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt-jackson</artifactId>
      <version>0.11.0</version>
      <scope>runtime</scope>
</dependency>

Vonage SDK 依赖于 jjwt v0.10.5,您的应用程序正在使用的方法是在 v0.10.0 中引入的 - 当参数被翻转时。 Maven 在处理依赖项的副本时可能有点古怪。在这种情况下,因为您明确引用了 0.9.1jjwt,所以它引入了不兼容的版本。如果我不得不在黑暗中试一试,我猜对非模块化 jjwt 包的引用先于其他依赖项 - 这就是为什么它被引入而不是其他依赖项。

无论如何 - 只需删除旧的 jjwt 包的引用 - 这将解决您的问题。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...