Spring Data MongoDB Converter не регистрируется - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть несколько конфигураций MongoDB.Вот класс конфигурации

@Configuration
@RequiredArgsConstructor
@EnableConfigurationProperties(MongoConfigProperties.class)
public class MultipleMongoConfig {
    private static final Logger logger = LoggerFactory.getLogger(MultipleMongoConfig.class);

    private final MongoConfigProperties mongoProperties;

    @Primary
    @Bean(name = "sysdiagMongoTemplate")
    public MongoOperations sysdiagMongoTemplate() {
        MappingMongoConverter mappingMongoConverter = new MappingMongoConverter(new DefaultDbRefResolver(sysdiagFactory(mongoProperties.getSysdiag())),
                new MongoMappingContext());

        List<Converter<?, ?>> converters = new ArrayList<>();
        converters.add(new AggregationResultReadConverter());

        mappingMongoConverter.setCustomConversions(new CustomConversions(CustomConversions.StoreConversions.NONE, converters));
        mappingMongoConverter.afterPropertiesSet();
        boolean canConvert = mappingMongoConverter.getConversionService().canConvert(Document.class, AggregationResult.class);
        mappingMongoConverter.afterPropertiesSet();
        logger.info("canConvertFromDocumentToAggResult:: " + canConvert); //gives TRUE

        return new MongoTemplate(sysdiagFactory(this.mongoProperties.getSysdiag()), mappingMongoConverter);
    }

    @Bean(name = "monitoringMongoTemplate")
    public MongoOperations monitoringMongoTemplate() {
        return new MongoTemplate(monitoringFactory(this.mongoProperties.getMonitoring()));
    }

    public MongoDbFactory sysdiagFactory(final MongoProperties mongo) {
        return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                mongo.getDatabase());
    }

    public MongoDbFactory monitoringFactory(final MongoProperties mongo) {
        return new SimpleMongoDbFactory(new MongoClient(mongo.getHost(), mongo.getPort()),
                mongo.getDatabase());
    }
}

Вот класс преобразователя чтения (мне нужно только чтение из MongoDB).У нас есть динамические ключи в документе, из-за которых мне нужно преобразовать их в карту

public class AggregationResultReadConverter implements Converter<Document, AggregationResult> {
    @Override
    public AggregationResult convert(Document source) {
        AggregationResult aggregationResult = new AggregationResult();
        aggregationResult.setData(new HashMap());
        for(Map.Entry<String,Object> entry : source.entrySet()){
            if(entry.getKey().matches("[A-Z][A-Z][A-Z]")){
                aggregationResult.getData().put(entry.getKey(), entry.getValue());
            }
        }
        return aggregationResult;
    }
}

. Вот конфигурация отображения для одной из баз данных MongoDB

@Configuration
@EnableMongoRepositories(basePackages = {"com.hns.services.restapi.db.mongo.sysdiag.entity", "com.hns.services.restapi.db.mongo.sysdiag.repo"}, mongoTemplateRef = "sysdiagMongoTemplate")
public class SysdiagMongoConfig {
}

.интерфейс репозитория

@Repository
public interface AggregationResultRepository extends MongoRepository<AggregationResult, ObjectId> {
    @Query("{ TIME: {$gte : ?0, $lt: ?1}}")
    List<AggregationResult> findInTimeRange(Long startTime, Long endTime);
}

Когда я выполняю запрос с использованием AggregationResultRepository, я ожидаю, что будет выполнен код преобразователя, чтобы я мог преобразовать поля и поместить их в объект класса Entity (Document) согласно логике.Запрос выполняется нормально, как я видел в журналах отладки, и вижу вывод, но конвертер не вызывается.

Преобразованный регистрируется в шаблоне mongo, поскольку регистратор canConvertFromDocumentToAggResult дает значение TRUE.Я попытался изменить конвертированный с Document -> AggregationResult на DBObject -> AggregationResult, но безуспешно.Не уверен, что мне здесь не хватает.

...