2016-04-12 2 views
0

私が取り組んでいる問題の簡単な例があります。私は数字の配列の配列を含むドキュメントを読み込もうとしています。モルフィアはマップできません整数のリスト一覧

{ 
    "_id" : ObjectId("570cf0167640ed9f8bcff8e7"), 
    "matrix" : [ 
     [ 
      42 
     ] 
    ] 
} 

すべてのインデックスを作成するために、私はorg.mongodb.morphia.Datastore#ensureIndexes()と呼んでいます。私が理解しているように、文書化されたものから、@Indexes注釈を探すクラスをMorphiaに伝えるためにorg.mongodb.morphia.Morphia#map(Class ...)に電話する必要があります。 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を壊すのか説明できますか?

次の例では、問題を再現しています(org.mongodb.morphia:morphia:1.1.1をdependencyとして追加してください)。

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

} 

答えて

0

あなたはthis testを見ればあなただけの罰金List<List<Integer>>作品を見ることができます。あなたの例を見ると、私はあなたが得ているエラーにつながる何も明らかではありませんが、私は少なくともList<List<Integer>>が動作することを確認することができます。 Javaドライバのどのバージョンを使用していますか?少なくとも3.x行になければなりません。

+0

ありがとう、ドライバは正しいヒントでした!私は 'mongo-java-driver:3.0.2'(morphia' pom.xml'のデフォルト依存関係)を持っています。バージョン3.2.2では期待通りに動作します。 – cmoetzing

+0

それはぞっとする。 – evanchooly