(聚合)无法找到类org.springframework.data.mongodb.core.geo.GeoJsonPoint的编解码器

时间:2017-10-20 16:59:13

标签: java spring mongodb aggregation

请问,请帮我解决以下问题?

我在上面给出的存储库中有上述错误

@Repository("polygonQueryRepository")
@RequiredArgsConstructor
public class PolygonQueryRepositoryImpl extends PolygonRepository {
    @Autowired
    private MongoOperations operations;

    public List<DBObject> findPolygonsMatchingGivenPointAndInputAggregate(Double lat, Double lng, String band) {
        GeoJsonPoint point = new GeoJsonPoint(lat, lng);
        MatchOperation operation = match(Criteria.where("location").intersects(point).and("attributes.band").regex(band));
        Aggregation aggregation = newAggregation(Polygon.class,
                unwind("attributes.transponders"),
                operation);
        AggregationResults<DBObject> result = 
        operations.aggregate(aggregation,"Polygon",DBObject.class);
        return result.getMappedResults();
    }
}

我之前读过我在定义MongoTemplate bean时需要注册编解码器。所以我做了 - 但仍然没有运气。

@Configuration
public class SpringMongoConfig {

    @Value("${mongo.db.name}")
    private String dbName;

    @Value("${mongo.db.host}")
    private String dbHost;

    @Bean
    public MongoDbFactory mongoDbFactory() throws Exception {
        MongoClientOptions options = MongoClientOptions.builder().codecRegistry(MongoClient.getDefaultCodecRegistry()).build();
        return new SimpleMongoDbFactory(new MongoClient(dbHost,options), dbName);
    }

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {
        MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory());
        return mongoTemplate;
    }
}

你有什么建议吗?

2 个答案:

答案 0 :(得分:0)

你接近这条线:

output.writeBytes(json.toString());

但要使用GeoJsonPoint类,您需要实现Codec接口,然后按以下方式注册:

MongoClientOptions options = MongoClientOptions
    .builder()
    .codecRegistry(MongoClient.getDefaultCodecRegistry())
    .build();

您可以在选项构建器中使用此注册表。

答案 1 :(得分:0)

cbartosiak,非常感谢你的回答!这对我帮助很大。但是解决方法超级超级显而易见!:)

实际上注册表是必需的,但我无法注册UNTIL我将聚合接口更改为

AggregationResults<AggregatedPolygon> result = template.aggregate((TypedAggregation<?>) aggregation, AggregatedPolygon.class);

所以我只需要向TypedAggregation aggregation对象添加强制转换,并从界面中删除集合名称。

这真的很奇怪,但这样对我有用。