2012-08-11 46 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