简体   繁体   中英

MongoDB: Spring Aggregation operation throws NoSuchMethodError

I'm doing a simple Aggregation operation. Following is my code:

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();

Here is the class that maps the MongoDB Collection:

@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;
}

}

And I have the class which I want to return my result as:

@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;
}
}

And this is the error I get:

[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

As you can see, my code is pretty basic. I don't know what I'm doing wrong here.

Note that I have tried running DataContentResult class both with and without @Entity and implements Serializable and there is no effect. So how come I get NoSuchMethodError ? And what does that error mean anyway?

EDIT: Following are the dependencies in my pom.xml. I'm not sure if library versions have anything to do with this.

<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>

I use you code lines and I am able to get

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"}}}]}

My pom.xml is at follows.

    <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>

Also tried with <org.mongodb.driver>3.2.1</org.mongodb.driver> and it works, what make me think that one of your imports is not correct.

check this github with the correct imports.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM