2012-08-11 50 views
0

我有一個串行的型號,像這樣:串行產生一個NullPointerException由於懶惰加入EBean

@Override 
public void serialize(MyModel model, JsonGenerator generator, SerializerProvider serializer) throws IOException,JsonProcessingException { 
    if (model == null) return; 

    SimpleDateFormat en = new SimpleDateFormat("yyyy-MM-dd"); 

    generator.writeStartObject(); 

    generator.writeNumberField("id", model.id); 
    generator.writeStringField("name", model.name); 
    generator.writeStringField("display", model.toString()); 

    SubModel subModel = model.subModel; 

    // HERE IT IS : 
    subModel.refresh(); // required to not have a nullpointerexception 
    // If I don't do that, the subModel.xxxx will throw a NullPointerException 
    // If I log the content : 
    Logger.info(String.valueOf(subModel)); 

    // It will work (display the toString()) AND the following won't throw a NullPointerException 

    generator.writeObjectFieldStart("quotas"); 
     generator.writeNumberField("id", subModel.id); 
     generator.writeStringField("display", subModel.toString()); 
    generator.writeEndObject(); 


    generator.writeEndObject(); 
    generator.close(); 
} 

爲什麼?有沒有辦法避免必須致電refresh()或其他東西?

感謝您的幫助。順便說一下,是否有可能在序列化程序中使用序列化程序:在我的情況下,我想列出model的所有屬性,但我只想列出subModel的一部分。這個Serializer的目標。但據我所知,我添加了列出所有屬性並將它們添加到生成器(第9行 - > 11)。是否可以通過添加子模型(ManyToOne關係)來序列化模型的所有直接屬性,而不在關係上使用@JsonIgnore?

感謝您的第二個幫助;)

回答

1

據我所知,有時,Ebean有一定難度,使具有公共屬性的加入,所以在你的模型中使用一個getter嘗試:getSubmodel()

public class MyModel extends Model { 

    ... 

    private SubModel subModel; 

    public SubModel getSubModel() { 
     return this.subModel; 
    } 
} 
+0

完美!有效。我嘗試了它,而不改變公共 - >私人的變種,它沒有奏效。但如果它被設置爲私人的,它就像一個魅力。謝謝! – 2012-08-11 11:38:25