【问题标题】:java.lang.NoSuchMethodError when using twilio SMS使用 twilio SMS 时出现 java.lang.NoSuchMethodError
【发布时间】:2021-04-10 07:33:32
【问题描述】:

我在 Netbeans 8.2 RC 中使用 Java web

我尝试使用 Twillio 客户端发送 SMS 消息:

Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
Message message = Message.creator(
                new com.twilio.type.PhoneNumber(getContact()),
                new com.twilio.type.PhoneNumber("+phonenumber"),
                "Sample message"
).create();

消息已成功传递。

但是代码在.create()之后没有继续。 抛出以下异常:

java.lang.NoSuchMethodError: 
com.fasterxml.jackson.datatype.jsr310.deser.JSR310DateTimeDeserializerBase.findFormatOverrides(Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/databind/BeanProperty;Ljava/lang/Class;)Lcom/fasterxml/jackson/annotation/JsonFormat$Value;

我尝试了什么

我没有pom.xmlbuild.gradle。我只有web.xml

我已经导入了库:twilio-8.9.0-jar-with-dependencies.jar

我该如何解决这个问题?

我拥有的图书馆:

【问题讨论】:

  • 尝试为 twilio 添加专业保护规则。 -keep class com.twilio.** { *; }
  • 我应该在哪里添加它
  • 您使用哪些库(重新)产生错误:twilio-8.9.0-jar-with-dependencies.jar 或屏幕截图中较旧的8.8.0❔ 另请使用堆栈跟踪发布完整的错误输出 ??????
  • 使用 twilio-7.14.0 jar 解决了 谢谢大家的回答

标签: java twilio jackson-databind nosuchmethoderror


【解决方案1】:

Twillio SDK,正是create() 方法,似乎依赖于Jackson(FasterXML 转换器库),尤其是它用于处理Java8 DateTime 的模块(JSR-310)。当create() 的调用导致NoSuchMethod... 缺少类JSR310DateTimeDeserializerBase 的方法时,这一点很明显。

? 如果您包含完整的错误输出,例如此异常的 stack-trace,那么我们很容易看到。

分析

ℹ️ NoSuchMethod 运行时错误通常不是由import 语句或web.xml 引起的。它通常与不匹配的依赖版本相关。

请参阅 Twilio Java SDK v 8.9.0 (jar),因为 shown in Maven's web-UI(与 v 8.8.0 相同)包括 pom.xml 和以下 依赖关系

<dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jsr310</artifactId>
      <version>${jackson.version}</version>
</dependency>?

properties下需要version

 <jackson.version>2.12.1</jackson.version>

检查依赖版本

确保此jar 或包包含在 Twillio jar 中或至少在您的类路径中。 ⚠️ 此外,版本必须匹配(例如,jackson-core v1 通常取决于 jackson-datatype v1)。较新或较旧的版本可能会更改方法(当前未找到),即调用或方法声明。

Jackson 版本的方法有变化吗?

在以前的版本 (2.11) 中,我还在类 JSR310DateTimeDeserializerBase 中找到了带有预期签名(参数和返回类型)的方法 findFormatOverrides。 它是在 JsonDeserializer 内部为 Java 日期时间属性调用的。这里当在上下文中创建反序列化器时,会调用父类的方法:

@Override public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {

    JsonFormat.Value format = findFormatOverrides(ctxt, property, handledType());

解决建议

How do I fix a NoSuchMethodError?。对该问题的评论适合您:

Netbeans 中:右键单击 Projects 选项卡中的项目,使用 “Clean and Build”。为我解决了。

? 这个article on NoSuchMethod 对这个问题很有帮助。

使用 Gradle 或 Maven

? 您应该考虑使用依赖管理和构建自动化工具,例如 MavenGradle

【讨论】:

  • @user15520720 与web.xml 无关。这是关于依赖关系(您的 classpath 中的类 l。是否有任何 其他 Jackson jar 可能会干扰(版本方面,例如不存在此方法的旧版本)❔
  • 我认为问题在于我正在使用import java.time.format.DateTimeFormatter;
  • @user15520720 不,我怀疑。此问题与在运行时发生冲突的冲突依赖项有关:虽然 Jackson-core (ObjectMapper) 尝试将 Twilio API 响应从 JSON 反序列化为 Java 对象,但它在堆栈跟踪中调用此方法并失败NoSuchMethodError。请参阅我的更新答案,我将如何解决:使用 Gradle 或 Maven。 ?️
猜你喜欢
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多