saiyancoder
saiyancoder

Reputation: 1325

How to ignore new fields for an object model with Firebase 1.0.2

I'm using the last version at the moment of Firebase dependency, which is 1.0.2 and I'm having problems into getting my pojos parsed correctly.

The thing is, at any time the schema can changed but I don't want my app to crash with this:

D/AndroidRuntime(14097): Shutting down VM W/dalvikvm(14097): threadid=1: thread exiting with uncaught exception (group=0x40a451f8) E/AndroidRuntime(14097): FATAL EXCEPTION: main E/AndroidRuntime(14097): com.firebase.client.FirebaseException: Failed to bounce to type E/AndroidRuntime(14097): at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:213)

Looking into the dependency tree I get that Firebase is using Jackson mapper 1.9.7, so the annotation @JsonIgnoreProperties(ignoreUnknown = true") is not an option. Moreover, the object mapper is wrapped into this Firebase object so I can't configure the DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES property (DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES for Jackson 1.9 and before).

Is there any way to set this property, either as a class-level annotation or configuring the mapper or any other mechanism whatsoever?

The best solution would be that Firebase 1.0.3 started using Jackson 2.0, but don't know if this is something they care about right now.

Note: I've already thought about excluding the transitive Jackson 1.9.7 dependency and adding Jackson 2.0 so that I can access to this ignoreUnknown feature, but I don't think it is a viable choice since I would be changing the mayor version.

Upvotes: 22

Views: 22307

Answers (4)

Dmytro Rostopira
Dmytro Rostopira

Reputation: 11175

Update:

As others pointed, annotation @Exclude is right way to use it now. But if you use Kotlin that won't work. For Kotlin use

    @Exclude @JvmField 
    var data: String? = nil
    //or
    @set:Exclude @get:Exclude 
    var data: String? = nil

Because annotation can be applied only for generated fields and not to properties.

Old answer:

I'm coming to Firebase from GSON were I used transient keyword. And that works with Firebase too

public transient String data;

Upvotes: 36

saiyancoder
saiyancoder

Reputation: 1325

Firebase 1.0.3 was released and now uses Jackson 2.2.2, so annotation @JsonIgnore is the way to go.

Edit: as of now in 2017, Firebase doesn't use Jackson anymore. the correct annotation is @Exclude.

Upvotes: 8

Chad Bingham
Chad Bingham

Reputation: 33876

As the accepted answer states, Firebase now uses Jackson, so you can annotate the desired methods you wish to ignore with

@JsonIgnore

Edit:

Firebase changed everything. Woot. Now use this instead:

@Exclude

Upvotes: 15

mineralwasser
mineralwasser

Reputation: 801

For those who have moved over to Google's official version of Firebase (As of May 29, 2016), you can use @Exclude instead of @JsonIgnore or @JsonProperty. Here is the link to their document.

Example:

public class dataPacket{
    public String data;
    ...
    @Exclude
    public String getData(){return data;}
}

Upvotes: 48

Related Questions