Jackson serializa propiedades con nombres dinámicamente diferentes usando mixins
Yo uso diferenteNoSQL
bases de datos y dependiendo de la base de datos necesito nombrar el "id" diferente. Entonces por ejemplo enOrientDB
la identificación se llama "@rid"
@JsonProperty("@rid")
private String id;
Y para MongoDB el id se llama "_id"
@JsonProperty("@_id")
private String id;
No sé qué está mal con los desarrolladores modernos de bases de datos, no solo nombrando el campo id "id" ^^. Pero ahora tengo un problema. ¿Cómo puedo serializar / deserializar dinámicamente el campo id en algún caso como "@rid" y en otro caso como "_id"?
EDITAR:
Basado en la sugerencia de rmullers, intenté usar mixins. Entonces tengo por ejemplo:
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);
}
Donde IdMixins es una interfaz completamente vacía que se usa para obtener más control sobre qué interfaces se pueden pasar al mapeador.
Entonces hay una clase:
@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;
}
}
Pero cuando ejecuto esta simple prueba, la salida sigue siendo "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;
}
}
}
Salidas:
{"@javaClass": "test.MixinTest $ Foo", "id": "123", "bar": "lala", "@ class": "Foo"} {"@javaClass": "test.MixinTest $ Foo "," id ":" 123 "," bar ":" lala "," @ class ":" Foo "}