Spring Data MongoDB Converter未注册

时间:2019-02-28 10:56:35

标签: mongodb spring-boot spring-data-mongodb

我有多个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中读取)。由于文档中有动态键,因此我需要将其转换为Map

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(文档)类对象。正如我在调试日志中看到的那样,查询进行得很顺利,并且看到了输出,但未调用转换器。

由于canConvertFromDocumentToAggResult记录器提供TRUE,转换后的文件已在mongo模板中注册。我尝试将转换后的Document -> AggregationResult更改为DBObject -> AggregationResult,但是没有运气。不知道我在这里想念什么。

0 个答案:

没有答案