我使用不同的NoSQL数据库,并且根据数据库,我需要将“ id”命名为不同的名称。因此,例如在OrientDBid中被命名为“ @rid”
NoSQL
OrientDB
@JsonProperty("@rid") private String id;
对于MongoDB,该ID名为“ _id”
@JsonProperty("@_id") private String id;
我不知道现代数据库开发人员有什么问题,不仅仅是命名id字段“ id” ^^。但是现在我有一个问题。在某些情况下,如何将ID字段动态序列化/反序列化为“ @rid”,在另一种情况下,如何动态序列化/反序列化为“ _id”?
编辑:
基于rmullers的建议,我尝试使用mixins。所以我有例如:
public interface IdMixins { } public interface MongoIdMixIn extends IdMixins { @JsonProperty("_id") String getId(); @JsonProperty("_id") void setId(String id); } public interface OrientIdMixIn extends IdMixins{ @JsonProperty("@rid") String getId(); @JsonProperty("@rid") void setId(String id); }
IdMixins是一个完全空的接口,仅用于获取更多控制权,这些接口可以通过密码传递给映射器。
然后有一个类:
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@javaClass") public abstract class AbstractBean implements Serializable { private static final long serialVersionUID = -1286900676713424199L; // @JsonProperty("@rid") private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } }
但是当我运行此简单测试时,输出仍然是“ id”:
public class MixinTest { public static void main(String[] args) throws JsonProcessingException { Foo f = new Foo(); f.setId("123"); f.setBar("lala"); ObjectMapper mapper = new ObjectMapper(); ObjectMapper m2 = mapper.copy(); m2.addMixInAnnotations(AbstractBean.class, MongoIdMixIn.class); System.out.println(m2.writeValueAsString(f)); ObjectMapper m3 = mapper.copy(); m3.addMixInAnnotations(AbstractBean.class, OrientIdMixIn.class); System.out.println(m3.writeValueAsString(f)); } public static class Foo extends AbstractBean { private String bar; public String getBar() { return bar; } public void setBar(String bar) { this.bar = bar; } } }
输出:
{“ @javaClass”:“ test.MixinTest $ Foo”,“ id”:“ 123”,“ bar”:“ lala”,“ @ class”:“ Foo”} {“ @javaClass”:“ test.MixinTest $ Foo”,“ id”:“ 123”,“ bar”:“ lala”,“ @ class”:“ Foo”}
您是否尝试过使用http://wiki.fasterxml.com/JacksonMixInAnnotations?然后你可以使用的OrientDbMixin和MongoDbMixin不同的@JsonProperty配置。
OrientDbMixin
MongoDbMixin
@JsonProperty
更新:工作示例
public final class JacksonTest { static final class ExampleBean { private String id; private String bar; @JsonProperty("donotwanttoseethis") public String getId() { return id; } public void setId(String id) { this.id = id; } public String getBar() { return bar; } public void setBar(String bar) { this.bar = bar; } } public interface MongoIdMixIn { @JsonProperty("_id") String getId(); } public interface OrientIdMixIn { @JsonProperty("@rid") String getId(); } private final static Logger LOG = LoggerFactory.getLogger(); public static void main(String[] args) throws JsonProcessingException { ExampleBean bean = new ExampleBean(); bean.setId("1234"); bean.setBar("lala"); ObjectMapper m2 = new ObjectMapper(); m2.addMixInAnnotations(ExampleBean.class, MongoIdMixIn.class); LOG.info(m2.writeValueAsString(bean)); ObjectMapper m3 = new ObjectMapper(); m3.addMixInAnnotations(ExampleBean.class, OrientIdMixIn.class); LOG.info(m3.writeValueAsString(bean)); } }