MongoDB:Spring Aggregation操作抛出NoSuchMethodError

时间:2016-04-25 16:16:29

标签: java spring mongodb aggregation-framework

我正在进行简单的聚合操作。以下是我的代码:

Aggregation aggregation = newAggregation(
        match(Criteria.where("publisherId").is(Integer.parseInt(publisherId)))
       , group("publisherId").count().as("total").sum("name").as("name").sum("zip").as("zip")
);

AggregationResults<DataContentResult> result = mongoTemplate.aggregate(aggregation , DataContent.class, DataContentResult.class);
List<DataContentResult> theResult = result.getMappedResults();

这是映射MongoDB集合的类:

@Document(collection = "DataContent")
public class DataContent{

@Id
private String _id;

private Integer publisherId;

private Integer name;
private Integer zip;

public String get_id() {
        return _id;
}

public void set_id(String _id) {
        this._id = _id;
}

public Integer getPublisherId() {
        return publisherId;
}

public void setPublisherId(Integer publisherId) {
        this.publisherId = publisherId;
}

public Integer getName() {
        return name;
    }

public void setName(Integer name) {
    this.name = name;
}

public Integer getZip() {
    return zip;
}

public void setZip(Integer zip) {
    this.zip = zip;
}

}

我有一个课程,我想把结果归结为:

@Entity
public class DataContentResult implements Serializable{

private static final long serialVersionUID = 6215495047789780758L;

String publisherId;
long total;
private Integer name;
private Integer zip;

public String getPublisherId() {
    return publisherId;
}

public void setPublisherId(String publisherId) {
    this.publisherId = publisherId;
}

public long getTotal() {
    return total;
}

public void setTotal(long total) {
    this.total = total;
}

public Integer getName() {
    return name;
}
public void setName(Integer name) {
    this.name = name;
}

public Integer getZip() {
    return zip;
}

public void setZip(Integer zip) {
    this.zip = zip;
}
}

这是我得到的错误:

[INFO] Caused by: java.lang.NoSuchMethodError: org.springframework.data.mongodb.core.MongoTemplate.aggregate(Lorg/springframework/data/mongodb/core/aggregation/Aggregation;Ljava/lang/Class;Ljava/lang/Class;)Lorg/springframework/data/mongodb/core/aggregation/AggregationResults;
[INFO]  at de.it2media.dps.statistics.server.dao.impl.MainMongoDAOImpl.getDataContentFilterStatisticData(MainMongoDAOImpl.java:124) ~[classes/:na]
[INFO]  at de.it2media.dps.statistics.server.service.impl.MainServiceMongoImpl.getDataContentFilterStatisticData(MainServiceMongoImpl.java:57) ~[classes/:na]
[INFO]  at de.it2media.dps.statistics.server.controller.HomeController.getDataContentFilterStatisticData(HomeController.java:66) ~[classes/:na]
[INFO]  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_25]
[INFO]  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_25]
[INFO]  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_25]
[INFO]  at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_25]
[INFO]  at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:587) ~[gwt-servlet-2.7.0.jar:na]
[INFO]  ... 47 common frames omitted

如您所见,我的代码非常基本。我不知道我在这里做错了什么。

请注意,我尝试使用DataContentResult@Entity运行implements Serializable类,但没有效果。那我怎么得到NoSuchMethodError?那个错误究竟意味着什么?

编辑:以下是我的pom.xml中的依赖项。我不确定库版本是否与此有关。

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>1.5.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver</artifactId>
    <version>3.2.1</version>
</dependency>
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.2.1</version>
</dependency>

1 个答案:

答案 0 :(得分:0)

我用你的代码行,我能够得到

10:49:39.342 [main] DEBUG o.s.data.mongodb.core.MongoTemplate - Executing aggregation: { "aggregate" : "DataContent" , 
"pipeline" : [ { "$match" : { "publisherId" : 10}} , 
{ "$group" : { "_id" : "$publisherId" , "total" : { "$sum" : 1} , "name" : { "$sum" : "$name"} , "zip" : { "$sum" : "$zip"}}}]}

我的pom.xml如下。

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-mongodb</artifactId>
        <version>${org.mongodb.version}</version>
    </dependency>

    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver</artifactId>
        <version>${org.mongodb.driver}</version>
    </dependency>

<org.mongodb.version>1.5.5.RELEASE</org.mongodb.version>
<org.mongodb.driver>3.0.0-beta3</org.mongodb.driver>

还尝试使用<org.mongodb.driver>3.2.1</org.mongodb.driver>并且它有效,是什么让我觉得你的某个导入不正确。

使用正确的导入检查此github