Java can';t序列化类org.springframework.data.geo.Point

Java can';t序列化类org.springframework.data.geo.Point,java,spring,mongodb,spring-data-mongodb,Java,Spring,Mongodb,Spring Data Mongodb,我试图使用SpringDataMongoDB1.6.2为一些GPS数据组合一个聚合查询。下面是它的样子: Aggregation agg = newAggregation( match(new Criteria() .andOperator( Criteria.where("eventTime").gte(filterDate), Cr

我试图使用SpringDataMongoDB1.6.2为一些GPS数据组合一个聚合查询。下面是它的样子:

    Aggregation agg = newAggregation(
            match(new Criteria()
                .andOperator(
                        Criteria.where("eventTime").gte(filterDate), 
                        Criteria.where("location").nearSphere(p).maxDistance(distance)
                )
            ),
            sort(Direction.DESC, "vanId", "eventTime"),
            group("vanId").first(Aggregation.ROOT).as("first")
    );

    return mongoTemplate.aggregate(agg,GpsDataEntity.MONGO_COLLECTION, GroupedEntity2.class);`
我看到的问题是由于查询的match()部分。异常非常长,因此我只包括了在上面的代码段中调用mongoTemplate.aggregate()的堆栈:

原因:java.lang.IllegalArgumentException:无法序列化类 org.springframework.data.geo.Point位于 org.bson.basicbonencoder._putObjectField(basicbonencoder.java:284) 位于org.bson.basicbonencoder.putObject(basicbonencoder.java:185) org.bson.basicbonencoder.\u putObjectField(basicbonencoder.java:240) 位于org.bson.basicbonencoder.putObject(basicbonencoder.java:185) org.bson.basicbonencoder.\u putObjectField(basicbonencoder.java:240) 位于org.bson.basicbonencoder.putObject(basicbonencoder.java:199) org.bson.basicbonencoder.\u putObjectField(basicbonencoder.java:240) 位于org.bson.basicbonencoder.putObject(basicbonencoder.java:185) org.bson.basicbonencoder.\u putObjectField(basicbonencoder.java:240) 位于org.bson.basicbonencoder.putObject(basicbonencoder.java:185) org.bson.basicbonencoder.\u putObjectField(basicbonencoder.java:240) 位于org.bson.basicbonencoder.putIterable(basicbonencoder.java:309) 在 org.bson.basicbonencoder._putObjectField(basicbonencoder.java:248) 位于org.bson.basicbonencoder.putObject(basicbonencoder.java:185) org.bson.basicbonencoder.putObject(basicbonencoder.java:131)位于 com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:33)位于 com.mongodb.OutMessage.putObject(OutMessage.java:289)位于 com.mongodb.OutMessage.writeQuery(OutMessage.java:211)位于 com.mongodb.OutMessage.query(OutMessage.java:86)位于 com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:81)位于 com.mongodb.DB.command(DB.java:317)位于 com.mongodb.DB.command(DB.java:296)位于 com.mongodb.DB.command(DB.java:371)位于 com.mongodb.DB.command(DB.java:243)位于 org.springframework.data.mongodb.core.MongoTemplate$1.doInDB(MongoTemplate.java:326) 在 org.springframework.data.mongodb.core.MongoTemplate$1.doInDB(MongoTemplate.java:324) 在 org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:394) 在 org.springframework.data.mongodb.core.MongoTemplate.executeCommand(MongoTemplate.java:324) 在 org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1418) 在 org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1353)

如果我删除nearSphere条件,上面的查询就可以正常工作。我已验证通过的点和距离是否有效


如果有人能指出我做错了什么,我将不胜感激。

这不是Spring Data MongoDB中的bug

实际上,$match聚合表达式中不允许使用“$nearSphere”。 您必须改用geoNear(..),请参见下面的示例

注意,mongodb要求geoNear是Aggregation管道中的第一个元素

@Test
public void serializePoinInCriteriaNearSphere() throws Exception {

    mongoTemplate.dropCollection(EventWithLocation.class);
    mongoTemplate.insert(new EventWithLocation(3, new Point(-73.99408, 40.75057), "42"));

    mongoTemplate.indexOps(EventWithLocation.class).ensureIndex(new GeospatialIndex("location"));

    Point p = new Point(-73, 40);
    NearQuery geoNear = NearQuery.near(p, Metrics.KILOMETERS).maxDistance(150.0);

    TypedAggregation<EventWithLocation> agg = newAggregation(EventWithLocation.class, //
            geoNear(geoNear, "distance") //
            , match(where("eventTime").gte(1)) //
            , sort(Direction.DESC, "eventTime") //
            , group("vanId").first(Aggregation.ROOT).as("first") //
    );

    AggregationResults<DBObject> results = mongoTemplate.aggregate(agg, DBObject.class);
    List<DBObject> list = results.getMappedResults();

    DBObject firstResult = list.get(0);
    assertThat(firstResult.get("_id"), is(equalTo((Object)"42")));
}

非常感谢你的帮助,托马斯。那么,是否没有办法复制这个查询(它似乎工作正常)?db['gps-events'].aggregate([{$match:{$gt:new ISODate(“2015-03-05T00:00:00.000Z”)},位置:{$geointen:{$centerSphere:[-109,48],.012]}}},{$sort:{vanId:1,eventTime:-1},{$group:{id:“$vanId”,“first:{$first:$$ROOT”}}});我添加了另一个变体-它可以做你想要的。啊,再次感谢托马斯。保持“近”和“内”的东西是有点棘手的,但这有帮助。我对它进行了测试,效果非常好。
@Test
public void serializePoinInCriteriaNearSphere() throws Exception {

... as above ...

    Point p = new Point(-73, 40);
    Circle circle = new Circle(p, new Distance(150.0, Metrics.KILOMETERS));

    TypedAggregation<EventWithLocation> agg = newAggregation(EventWithLocation.class, //
            match(where("eventTime").gte(1).and("location").withinSphere(circle)) //
            , sort(Direction.DESC, "eventTime") //
            , group("vanId").first(Aggregation.ROOT).as("first") //
    );

... as above
}