【问题标题】:Spring Mongotemplate fails when creating the instance创建实例时 Spring Mongotemplate 失败
【发布时间】:2019-12-10 09:53:05
【问题描述】:

我正在使用 MongoTemplate 从 MongoDb 获取数据。下面是我的 POJO 的代码和从 Mongo 获取数据的方法。我在 API 命中时遇到异常。这是一个 PATCH API 调用。 这是一个 Spring 应用程序,而不是一个 Spring Boot 应用程序 POJO

import java.io.Serializable;

import java.io.Serializable;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.springframework.data.mongodb.core.mapping.Document;

import com.fasterxml.jackson.annotation.JsonProperty;

@Document(collection = "my_mongo_collection")
public class MyClass extends ParentClass implements Serializable {

    private static final long serialVersionUID = -1490956384479197360L;

    @JsonProperty("identityNumber")
    private Long identityNumber;

    @JsonProperty("title")
    private Long title;

    @JsonProperty("reviews")
    private Review reviews;

    public MyClass() {
        super();
    }

    @JsonProperty("identityNumber")
    public Long getIdentityNumber() {
        return identityNumber;
    }

    @JsonProperty("identityNumber")
    public void setIdentityNumber(Long identityNumber) {
        this.identityNumber = identityNumber;
    }

    @JsonProperty("title")
    public String getTitle() {
        return title;
    }

    @JsonProperty("title")
    public void setTitle(String title) {
        this.title = title;
    }

    @JsonProperty("reviews")
    public Review getReviews() {
        return reviews;
    }

    @JsonProperty("reviews")
    public void setReviews(Review reviews) {
        this.reviews = reviews;
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this).append("Subscription [id=").append(super.getId())
                .append(", name=", super.getName()).append(" , identity=", identity).append(",reviews=", reviews)
                .append("} ]").toString();

    }
}

从 Mongo 访问数据的方法:

private List<MyClass> getAllValues(Long identity, String title) {
         Query query= new Query();
        memSubscriptionQuery.addCriteria(Criteria.where("identityNumber").is(identityNumber).and("title").is(title));
        return mongoTemplate.find(query, MyClass .class);


    }

下面的异常被抛出:

org.springframework.data.mapping.model.MappingInstantiationException: Failed to instantiate java.util.List using constructor NO_CONSTRUCTOR with arguments
    at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:64)

at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:64)
    at org.springframework.data.convert.ClassGeneratingEntityInstantiator.createInstance(ClassGeneratingEntityInstantiator.java:83)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:258)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:238)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readValue(MappingMongoConverter.java:1218)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.access$200(MappingMongoConverter.java:85)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1166)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getValueInternal(MappingMongoConverter.java:877)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:290)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:278)
    at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:330)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:278)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:238)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readValue(MappingMongoConverter.java:1218)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.access$200(MappingMongoConverter.java:85)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1166)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getValueInternal(MappingMongoConverter.java:877)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:290)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:278)
    at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:330)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:278)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:238)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:198)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:194)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:85)
    at org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:2313)
    at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1966)
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1784)
    at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1767)
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:641)
    at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:632)
    at 

【问题讨论】:

    标签: java spring mongodb mongotemplate


    【解决方案1】:

    MongoTemplate.find() 返回一个 OP 使用的 List 是正确的。作为异常通知,OP 应该创建另一个构造函数来包含所有变量(如 @AllArgConstructors)。

    【讨论】:

      【解决方案2】:

      看起来您正在将 Class 对象传递给 mongo 模板并期望得到 List 作为回报。

      return mongoTemplate.find(query, MyClass .class);
      

      您可能必须将方法的返回类型更改为MyClass

      private MyClass getAllValues(Long identity, String title) 
      

      如果你需要一个列表而不是一个对象,你必须将你的类对象包装在另一个获取对象列表的类中。

      【讨论】:

      • 什么是包装选项?如果我可以返回 MyClass 对象列表,您能否提供一下代码快照。
      • 能否也提供你要解析的json?
      • @M.WaqasPervez 我不认为这是一个答案。 MongoTemplate.find() 返回 OP 使用的 List 是正确的。作为异常通知,OP 应该创建另一个构造函数来包含所有变量(如 @AllArgConstructors)。
      猜你喜欢
      • 2019-08-18
      • 2021-09-03
      • 2021-02-01
      • 1970-01-01
      • 2021-05-04
      • 2012-11-01
      • 1970-01-01
      • 2012-08-29
      • 2022-01-05
      相关资源
      最近更新 更多