我试图根据视图序列化一个属性。不幸的是,下面的代码并没有起作用,因为Jackson报告了一个冲突的getter属性" userId"。有没有办法根据特定表示中的视图获取对象?
copysign
这就是我想要的:
查看1:
@JsonView(Views.Mongo.class)
@JsonProperty("userId")
public ObjectId getUserId() {
return userId;
}
@JsonView(Views.Frontend.class)
@JsonProperty("userId")
public String getUserIdAsString() {
return userId.toString();
}
观看2:
{ userId: { '$oid' : "16418256815618" } }
答案 0 :(得分:0)
我认为您可以编写一个自定义序列化程序,它根据活动视图执行此任务,如下所示。
public class ObjectIdSerializer extends JsonSerializer<ObjectId> {
@Override
public void serialize(ObjectId objectId, JsonGenerator gen, SerializerProvider provider) throws IOException {
if (provider.getActiveView() == Frontend.class) {
gen.writeString(objectId.toString());
} else {
// Do default serialization of ObjectId.
gen.writeStartObject();
gen.writeFieldName("idField1");
gen.writeString(objectId.getIdField1());
gen.writeFieldName("idField2");
gen.writeString(objectId.getIdField2());
gen.writeEndObject();
}
}
}
然后修改你的pojo,如下所示
@JsonSerialize(using=ObjectIdSerializer.class)
public ObjectId getUserId() {
return userId;
}
您不必在getter / field中传递任何视图注释,因为在自定义序列化器中需要注意。
在此示例中,我手动完成了默认序列化。或者,您可以使用默认序列化程序通过注册序列化修饰符来完成它,如问题How to access default jackson serialization in a custom serializer中所述。