Search code examples
javamongodbmorphia

morphia handle bad data


Let's say I have some json like this in mongo:

{"n":"5"}

and a java class like this:

@Entity 
public class Example {
    Integer n;
}

This works (I know that the json should store the value as an int not a string but I don't control that part).

Now when I have data like this morphia throws:

{"n":""}

I'm looking for a workaround (the behavior I'd like is for empty string to be treated same as null).

The only workaround I have so far is:

public class Example {
    String n;

    public Integer getN() {
        return NumberUtils.isNumber(n) ? NumberUtils.createInteger(n) : null;
    }
}

But I'm hoping for some way to hang an annotation on the Integer property that customizes the deserialization behavior.


Solution

  • So I asked this on the morphia google group and I thought I'd share the answer. Using the lifecycle annotation @PreLoad allows me to modify the DBObject before conversions into POJO takes place. So this should do it:

    @PreLoad void fixup(DBObject obj) {
        if (StringUtils.isEmpty(obj.get("n"))) {
            obj.put("n",null);
        }
    }