2016-04-12 3 views
0

У меня есть упрощенный пример проблемы, над которой я работаю. Я пытаюсь загрузить документ, содержащий массив массива чисел.Morphia не может отображать Список List of Integer

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

Чтобы создать все индексы, я вызываю org.mongodb.morphia.Datastore#ensureIndexes(). Насколько я понимаю, из того, что документировано, мне нужно позвонить org.mongodb.morphia.Morphia#map(Class ...), чтобы сообщить Морфию, на каких классах искать аннотацию @Indexes. Без 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 

Может кто-нибудь объяснить, почему явным образом называет карту() ломает морфию?

Следующая утилита воспроизводит проблему (просто добавьте org.mongodb.morphia: morphia: 1.1.1 как зависимость).

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

Спасибо, водитель был правильным намеком! Я только уточнил Morphia как зависимость maven, которая получила мне «mongo-java-driver: 3.0.2» (зависимость по умолчанию в morphia 'pom.xml'. С версией« 3.2.2 »она работает должным образом. – cmoetzing

+0

Я обновлю что пом в git. – evanchooly

 Смежные вопросы

  • Нет связанных вопросов^_^