Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 莫菲娅可以';整数列表的t映射列表_Java_Mongodb_Morphia - Fatal编程技术网

Java 莫菲娅可以';整数列表的t映射列表

Java 莫菲娅可以';整数列表的t映射列表,java,mongodb,morphia,Java,Mongodb,Morphia,我有一个我正在研究的问题的简化示例。我试图加载一个包含数字数组的文档 { "_id" : ObjectId("570cf0167640ed9f8bcff8e7"), "matrix" : [ [ 42 ] ] } 为了创建所有索引,我调用org.mongodb.morphia.Datastore#ensureIndex()。据我所知,根据文档,我需要调用org.mongodb.morphia.morphia#m

我有一个我正在研究的问题的简化示例。我试图加载一个包含数字数组的文档

{
    "_id" : ObjectId("570cf0167640ed9f8bcff8e7"),
    "matrix" : [ 
        [ 
            42
        ]
    ]
}
为了创建所有索引,我调用
org.mongodb.morphia.Datastore#ensureIndex()
。据我所知,根据文档,我需要调用
org.mongodb.morphia.morphia#map(Class…
,告诉morphia在哪些类上查找
@索引
注释。如果没有
Morphia#map(…)
应用程序运行良好(正如预期的那样,不会创建索引)。如果我添加
Morphia#map(…)
我会得到一个异常

Exception in thread "main" java.lang.RuntimeException: java.lang.IllegalArgumentException: BasicBSONList can only work with numeric keys, not: [elementData]
    at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:74)
    at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:772)
    at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:230)
    at org.mongodb.morphia.mapping.Mapper.fromDBObject(Mapper.java:191)
    at org.mongodb.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:134)
    at org.mongodb.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:146)
    at org.mongodb.morphia.query.MorphiaIterator.next(MorphiaIterator.java:117)
    at org.mongodb.morphia.query.QueryImpl.asList(QueryImpl.java:150)
    at it.test.Main.fails(Main.java:41)
    at it.test.Main.main(Main.java:24)
Caused by: java.lang.IllegalArgumentException: BasicBSONList can only work with numeric keys, not: [elementData]
    at org.bson.types.BasicBSONList._getInt(BasicBSONList.java:168)
    at org.bson.types.BasicBSONList._getInt(BasicBSONList.java:160)
    at org.bson.types.BasicBSONList.get(BasicBSONList.java:105)
    at org.mongodb.morphia.mapping.MappedField.getDbObjectValue(MappedField.java:190)
    at org.mongodb.morphia.converters.Converters.fromDBObject(Converters.java:121)
    at org.mongodb.morphia.mapping.ValueMapper.fromDBObject(ValueMapper.java:20)
    at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:766)
    at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:230)
    at org.mongodb.morphia.mapping.EmbeddedMapper.readMapOrCollectionOrEntity(EmbeddedMapper.java:206)
    at org.mongodb.morphia.mapping.EmbeddedMapper.readCollection(EmbeddedMapper.java:142)
    at org.mongodb.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:45)
    ... 9 more
有人能解释为什么显式调用map()会破坏Morphia吗

下面的exmaple重现了这个问题(只需添加org.mongodb.morphia:morphia:1.1.1作为依赖项)

package.test;
导入java.util.List;
导入org.bson.types.ObjectId;
导入org.mongodb.morphia.Datastore;
导入org.mongodb.morphia.morphia;
导入org.mongodb.morphia.dao.BasicDAO;
导入org.mongodb.morphia.query.QueryResults;
导入com.mongodb.MongoClient;
导入com.mongodb.MongoClientURI;
导入it.test.model.Doc;
公共班机{
私有静态最终字符串URI=”mongodb://localhost:27017";
私有静态最终字符串NAME=“test”;
私有静态最终MongoClient_URI=新MongoClient(URI+“/”+名称);
公共静态void main(字符串[]args){
Main Main=新Main();
main.works();
main.fails();
}
私有void失败(){
try(MongoClient client=新的MongoClient(client_URI)){
Morphia Morphia=新Morphia();
morphia.getMapper().getOptions().setStoreEmpties(true);
mapPackage(“it.test.model”);
查找(morphia,client,client_URI.getDatabase());
}
}
私人工程(){
try(MongoClient client=新的MongoClient(client_URI)){
Morphia Morphia=新Morphia();
morphia.getMapper().getOptions().setStoreEmpties(true);
//morphia.mapPackage(“it.test.model”);//错误的调用?
查找(morphia,client,client_URI.getDatabase());
}
}
私有void find(Morphia Morphia、MongoClient、String dbName){
Datastore Datastore=morphia.createDatastore(client,dbName);
BasicDAO=新的BasicDAO(Doc.class,数据存储);
QueryResults result=dao.find();
List rootEntities=result.asList();
System.out.println(“Found”+rootEntities.size()+“RootEntity文档”);
}
}
包装it.test.model;
导入java.util.List;
导入org.bson.types.ObjectId;
导入org.mongodb.morphia.annotations.Entity;
导入org.mongodb.morphia.annotations.Id;
@实体
公共类文件{
@身份证
私有ObjectId;
公共ObjectId getId(){
返回id;
}
public void setId(ObjectId id){
this.id=id;
}
私有列表矩阵;
公共列表getMatrix(){
收益矩阵;
}
公共无效集合矩阵(列表矩阵){
这个矩阵=矩阵;
}
}

如果您查看,您可以看到
列表
工作正常。查看您的示例,我没有看到任何明显的错误,但我至少可以验证
List
是否有效。您使用的是什么版本的Java驱动程序?它至少应该在3.x行。

谢谢,司机是正确的提示!我只将Morphia指定为maven依赖项,这使我获得了mongo java驱动程序:3.0.2(Morphia
pom.xml
中的默认依赖项。对于版本
3.2.2
,它可以按预期工作。
package it.test;

import java.util.List;

import org.bson.types.ObjectId;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.Morphia;
import org.mongodb.morphia.dao.BasicDAO;
import org.mongodb.morphia.query.QueryResults;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;

import it.test.model.Doc;

public class Main {
    private static final String URI = "mongodb://localhost:27017";
    private static final String NAME = "test";
    private static final MongoClientURI CLIENT_URI = new MongoClientURI(URI + "/" + NAME);

    public static void main(String[] args) {
        Main main = new Main();

        main.works();
        main.fails();
    }

    private void fails() {
        try (MongoClient client = new MongoClient(CLIENT_URI)) {
            Morphia morphia = new Morphia();
            morphia.getMapper().getOptions().setStoreEmpties(true);
            morphia.mapPackage("it.test.model");

            find(morphia, client, CLIENT_URI.getDatabase());
        }
    }

    private void works() {
        try (MongoClient client = new MongoClient(CLIENT_URI)) {
            Morphia morphia = new Morphia();
            morphia.getMapper().getOptions().setStoreEmpties(true);
            // morphia.mapPackage("it.test.model"); // bad call?

            find(morphia, client, CLIENT_URI.getDatabase());
        }
    }

    private void find(Morphia morphia, MongoClient client, String dbName) {
        Datastore datastore = morphia.createDatastore(client, dbName);

        BasicDAO<Doc, ObjectId> dao = new BasicDAO<>(Doc.class, datastore);
        QueryResults<Doc> result = dao.find();
        List<Doc> rootEntities = result.asList();

        System.out.println("Found " + rootEntities.size() + " RootEntity documents.");
    }
}

package it.test.model;

import java.util.List;

import org.bson.types.ObjectId;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Id;

@Entity
public class Doc {

    @Id
    private ObjectId id;

    public ObjectId getId() {
        return id;
    }

    public void setId(ObjectId id) {
        this.id = id;
    }

    private List<List<Integer>> matrix;

    public List<List<Integer>> getMatrix() {
        return matrix;
    }

    public void setMatrix(List<List<Integer>> matrix) {
        this.matrix = matrix;
    }

}