java - Jackson 无法在 Android 上加载 JDK7 类型

标签 java android jackson java-7 kotlin

我在我的 Android 应用中使用 Jackson 2.8.2 来反序列化 JSON。反序列化本身可以工作,但是,我可以在应用程序日志中看到以下警告:

Unable to load JDK7 types (annotations, java.nio.file.Path): no Java7 support added

Proguard 已禁用,sourceCompatibility 设置为 '1.7'。如何将这些看似缺失的类型添加到我的构建中?

最佳答案

首先,您的 1.7sourceCompatibility 设置对运行时环境没有任何意义,因此对这条消息没有影响。

这纯粹是一个“这些类在 Jackson 初始化这个类时是否存在”问题——它们确实以某种组合存在。也许没关系,如果您不使用 Java 7 java.nio.file.Path 类,那么您应该不会对这个记录的 warning 消息有任何问题。因为这就是这个警告的内容,Jackson 支持这个特定类的序列化/反序列化。

Android java.nio.* packages ,它在 any API 级别没有 java.nio.file.* 包。这就解释了为什么您会看到警告消息。而且由于您无论如何都不能使用 java.nio.file.Path,除了烦人的日志消息之外,这甚至不是真正的问题。

如果此消息令人讨厌,您始终可以将记录器 com.fasterxml.jackson.databind.ext.Java7Support 的 Java Util Logging 级别设置为级别 ERROR。然后您将不再看到这些警告消息。

有关记录消息的更多信息:

在 Jackson 2.8.x 中,对 Java 7 类 java.nio.file.Path 的支持都是从同一个 JAR 文件加载的,并且是内置的。一个类动态检查另一个类是否可以正确加载:

Class<?> cls = Class.forName("com.fasterxml.jackson.databind.ext.Java7SupportImpl");

这可能失败的唯一方法是,如果有什么东西从最后一组类中剥离了这个类。或者它所依赖的这些类之一从运行时中丢失:

import java.beans.ConstructorProperties;
import java.beans.Transient;
import java.nio.file.Path;

如果缺少其中任何一个,您将看到记录的错误消息。所以其中之一是正确的:

  • 运行时缺少一个或多个 JDK 7 类
  • com.fasterxml.jackson.databind.ext.Java7SupportImpl 在运行时丢失

这些原因都不是 Jackson 的错,它们与您的运行时环境有关(即它们不存在于 Android API 中),或者它认为没有使用的 Proguard 剥离类。

另见:

关于java - Jackson 无法在 Android 上加载 JDK7 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39425594/

相关文章:

java - 如何使用 JAXB 为 XML 中的空元素生成结束标记

android - android proguard在build.gradle中动态应用映射

android - OpenCV Android CameraBridgeViewBase 如何抓取帧、处理它并绘制它,而不会被帧抓取中断

java - Android Studio LogCat 并不总是在循环内输出字段

java - Jackson 对象映射器异常

java - Kotlin Jackson Mapper 将 String 反序列化为 HashMap<String, Any> 而不是类型

java:rest api 中的时区

java - ActiveMQ 队列的活跃消费者太多

java - 如何在 nginx 和 tomcat 中使用可信证书?

java - 反序列化 JSON 对象时如何忽略特定属性?