Методы Mongojack *ById() не работают при использовании аннотации Джексона @JsonTypeInfo
Я использую Джексона @JsonTypeInfo
для разрешения полиморфного типа на объектах, хранящихся в Mongo, используя Mongojack. По какой-то причине кажется, что всякий раз, когда я использую эту аннотацию, я не могу использовать *ById()
методы (например, findOneById
или же updateById
): методы "find" возвращают null, методы "update" не имеют никакого эффекта. Я не понимаю, почему @JsonTypeInfo
будет мешать обработке идентификаторов Mongojack.
Ниже приведен пример кода для воспроизведения проблемы. Обратите внимание, что - этот код хранит Id как ObjectId в базе данных, как и предполагалось.
- удалить @JsonTypeInfo(...)
строка и код работает как положено.
- Здесь не задействован полиморфизм, это просто причина, по которой мне нужна аннотация, но в данном примере она не имеет отношения к проблеме.
- Я использую Mongojack 2.8.0 и Джексон 2.9.1.
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type")
class Entry {
@Id
private String id;
private String type;
private String name;
public Entry() {
this.setType("entry");
}
public Entry(String type, String name) {
this.type = type;
this.name = name;
}
@ObjectId
public String getId() {
return id;
}
@ObjectId
public void setId(String id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Tester {
public static void main(String [ ] args) {
Entry entry = new Entry("entry", "someName");
DB db = MongoDB.getDB();
/* Create an entry in DB */
DBCollection dbCollection = db.getCollection( "entries" );
JacksonDBCollection<Entry, String> coll = JacksonDBCollection.wrap(dbCollection, Entry.class, String.class);
WriteResult<Entry, String> result = coll.insert(entry);
entry.setId(result.getDbObject().get("_id").toString());
/* Query the entry from DB */
Entry newEntry = coll.findOneById(entry.getId()); // -> returns null
/* Update Entry in DB */
entry.setName("someOtherName");
coll.updateById(entry.getId(), entry); // -> Has no effect
}
Например, обменять этот последний updateById
звать coll.update(DBQuery.is("_id", entry.getId()), entry);
работает отлично.
Я делаю что-то не так или это неожиданное поведение?