Методы 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); работает отлично.

Я делаю что-то не так или это неожиданное поведение?

0 ответов

Другие вопросы по тегам