代码之家  ›  专栏  ›  技术社区  ›  Truerick

Java Spring+MongoTemplate无法检索对象列表

  •  0
  • Truerick  · 技术社区  · 8 年前

    我有一个链接到MongoDB集合的Java类:

    @Document(collection = "my_collection")
    public class Ev extends MyDTO{
        @Id
        private String id;
        @Indexed
        private String sessionId;
        private List<String> findings;
    }
    

    我不得不改变 findings 在这个

        private List<MyObject> findings;
    

    声明为

    public class MyObject {
        private String find;
        private String description;
        private int number;
        private List<SecondaryObj> details;
    }
    

    这是构造器

    public MyObject(String find, int number) {
        super();
        this.find= find;
        this.number= number;
    }
    
    public MyObject(String find, int number, List<SecondaryObj> details) {
        super();
        this.find= find;
        this.details = details;
        this.number= number;
    }
    

    所以在MongoDB中我有一个类似的情况

    {
        "_id" : ObjectId("5b487a2667a1aa18f*******"),
        "sessionId" : "abc123mySessionId",
        "findings" : [ 
            {
                "find" : "HTTPS",
                "description" : "I found HTTPS",
                "number" : 10,
                "details": [
                    {"a":"1", "b":"2"},
                    {"a":"2", "b":"3"}
                ]
            },
            {
                "find" : "NAME",
                "description" : "I found name",
                "number" : 3,
                "details": [
                    {"a":"1", "b":"2"},
                    {"a":"2", "b":"3"}
                ]
            }
        ]
    }
    

    显然,我更新了所有方法以匹配新的数据集,但是如果我尝试检索

    Query searchQuery = new Query(Criteria.where("sessionId").is("abc123mySessionId"));
    Ev result = mongoTemplate.findOne(searchQuery, Ev.class);
    

    我得到这个错误

    Request processing failed; nested exception is org.springframework.data.mapping.model.MappingInstantiationException: Failed to instantiate com.my.project.domain.MyObject using constructor NO_CONSTRUCTOR with arguments
    

    有根本原因

    java.lang.NoSuchMethodException: om.my.project.domain.MyObject.<init>()
    

    我在用 spring-data-mongodb version 2.0.8 mongo-java-driver version 3.8.0

    我想我应该在某个地方声明我的目标,但我在春天是很新的,所以我试着用一种有点盲目的方式…有什么建议吗?

    2 回复  |  直到 8 年前
        1
  •  1
  •   yuppie-flu    8 年前

    您有两个非零参数构造函数,spring不知道要调用哪一个。它试图调用no args构造函数,但您的类没有该构造函数。 检查spring数据mongo docs

    您可以创建no args构造函数并将其标记为 @PersistenceConstructor 注解。这样spring调用它来创建一个对象,并基于文档字段名通过反射设置字段,因此不需要setter。

        2
  •  0
  •   Naresh N. Banda    8 年前
    @Document(collection = "my_collection")
    public class Ev extends MyDTO{
    @Id
    private String id;
    @Indexed
    private String sessionId;
    private List<MyObject> findings;}
    
    public class MyObject {
    private String find;
    private String description;
    private int number;}
    

    在SpringBootStarter数据MongoDB版本2.0.3.release中,它对我来说很好