【问题标题】:Failure to write a simple POJO to Firebase (Android)未能将简单的 POJO 写入 Firebase (Android)
【发布时间】:2016-05-08 09:09:37
【问题描述】:

我正在尝试将 Firebase Android 与一些简单的 POJO 一起使用,但即使使用以下示例代码,我也会遇到一些异常

final Firebase fb = getFirebaseAccess();
final Subscription subscription = new Subscription(url, System.currentTimeMillis());
Firebase subscriptionRef = fb.child("subscriptions").push();
subscriptionRef.setValue(subscription); // exception thrown here

// Subscription.java

 public class Subscription {

        private String url;
        private long subscribedAt;

        public Subscription() {
        }

        public Subscription(String url, long subscribedAt) {
            this.url = url;
            this.subscribedAt = subscribedAt;
        }

        public String getUrl() {
            return this.url;
        }

        public void setUrl(String url) {
            this.url = url;
        }

        public long getSubscribedAt() {
            return this.subscribedAt;
        }

        public void setSubscribedAt(long subscribedAt) {
            this.subscribedAt = subscribedAt;
        }
    }

抛出以下异常:

无法解析为快照 com.fasterxml.jackson.databind.JsonMappingException: 没有找到类 com.mypackage.Subscription 的序列化程序,也没有发现创建 BeanSerializer 的属性(为避免异常,请禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS) 没有为类 com.myPackage.Subscription 找到序列化程序,也没有找到用于创建 BeanSerializer 的属性(为避免异常,请禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS)

我不明白发生了什么失败,因为我保留了公共默认构造函数,并且每个变量都有自己的公共 getter...

有什么想法吗?

顺便说一句,如果我用字符串字段或属性映射替换 POJO,它可以正常工作

编辑: 我正在使用启用了 minify 的 Proguard。 我有以下说明:

# Firebase 2.0
# keep POJOs
-keepnames class com.myPackage.** { *; }
-keep class com.firebase.** { *; }
-keep class org.apache.** { *; }
-keepnames class com.fasterxml.jackson.** { *; }
-keepnames class javax.servlet.** { *; }
-keepnames class org.ietf.jgss.** { *; }
-dontwarn org.w3c.dom.**
-dontwarn org.joda.time.**
-dontwarn org.shaded.apache.**
-dontwarn org.ietf.jgss.**

【问题讨论】:

  • 嗯...唯一迅速想到的是 proguard 可能正在缩小您的 Subscription 类。见stackoverflow.com/questions/26273929/…
  • 你说得对,我正在使用 Proguard 和 minify,但我已经在使用这些说明(我编辑了问题)
  • 好的。如果禁用proguard,问题就消失了吗? (这不是解决方案,但至少要确保我们的方向是正确的)
  • 我现在无法禁用它,因为我将达到 65K DEX 限制...
  • 可能是个愚蠢的问题,但您是否更改了-keepnames class com.myPackage.** { *; } 以匹配您的 包?

标签: android jackson firebase pojo firebase-realtime-database


【解决方案1】:

看起来 Jackson 相关文件正在通过 Proguard 删除,请尝试以下 Proguard 配置:

    # Proguard configuration for Jackson 2.x (fasterxml package instead of codehaus package)

        -keep class com.fasterxml.jackson.databind.ObjectMapper {
            public <methods>;
            protected <methods>;
        }
        -keep class com.fasterxml.jackson.databind.ObjectWriter {
            public ** writeValueAsString(**);
        }

        # Basic ProGuard rules for Firebase Android SDK 2.0.0+

        -keep class com.firebase.** { *; }
        -keep class org.apache.** { *; }
        -keepnames class com.fasterxml.jackson.** { *; }
        -keepnames class javax.servlet.** { *; }
        -keepnames class org.ietf.jgss.** { *; }
        -dontwarn org.apache.**
        -dontwarn org.w3c.dom.**

# Facebook

-keep class com.facebook.** {*;}
-keepattributes Signature

# Firebase UI

-dontwarn com.firebase.ui.auth.twitter.**

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多