Не удается найти кодек при использовании необработанного DBCollection - PullRequest
0 голосов
/ 24 апреля 2019

Прежде всего, я работаю со старым драйвером Монго (1.5.6) и не могу его обновить. Кроме того, мы сталкиваемся с серьезными проблемами производительности при использовании MongoTemplate, поэтому мы решили не использовать его. Вместо этого мы перебираем DBCollection

public class CustomMongoTemplate {
    private final DBCollection collection;
    private DBToEntityTranslator dbToEntityTranslator = new DBToEntityTranslator();

    public CustomMongoTemplate(MongoConfig mongoConfiguration) {
        collection = mongoConfiguration.getCollection();       
    }

    public List<MyEntity> find(Query query) {
        return convert(doFind(query));
    }

    private DBCursor doFind(Query query) {
        return collection.find(query.getQueryObject());
    }

    private List<MyEntity> convert(DBCursor cursor) {
        List<MyEntity> entities = new ArrayList<>();
        while (cursor.hasNext()) {
            entities .add(dbToEntityTranslator.toEntity((cursor.next())));
        }

        return entities ;
    }
}

А вот мой класс конфигурации.

@Configuration
public class MongoConfig extends AbstractMongoConfiguration {


    private DBCollection collection;

    @PostConstruct
    private void init() throws Exception {
        DB db = mongo().getDB(dbName);
        collection = db.getCollection("mycollection");
    }

    @Override
    protected String getDatabaseName() {
        return dbName;
    }

    @Override
    public Mongo mongo() throws Exception {
        CodecProvider pojoCodecProvider = PojoCodecProvider.builder().register("com.company.entities").build();
        CodecRegistry pojoCodecRegistry = fromRegistries(MongoClient.getDefaultCodecRegistry(), fromProviders(pojoCodecProvider));

        MongoClientOptions mongoClientOptions = MongoClientOptions.builder().codecRegistry(pojoCodecRegistry).build();

        return new MongoClient(Collections.singletonList(new ServerAddress(host, port)),
                Collections.singletonList(MongoCredential.createMongoCRCredential(userName, dbName, password.toCharArray())),
                mongoClientOptions);
    }

Как видите, я пытаюсь зарегистрировать свои классы сущностей в CodecRegistry, поэтому я могу использовать Criteria, который выглядит следующим образом

criteria.add((Criteria.where("root.myEntity").exists(true).all(myEntity)));

Где myEntity - мой объект класса com.company.entities.MyEntity, который должен быть зарегистрирован. Однако, когда я пытаюсь запустить это, я получаю

"Не удается найти кодек для класса com.company.entities.MyEntity."

...