2014-11-13 4 views
1

у меня есть конвертер записи какMongoDB конвертеры + Spring Data с внедренными объектами

public class CarConverter implements Converter<Car, DBObject> { 

@Override 
public final DBObject convert(final Car car) { 
    DBObject dbo = new BasicDBObject(); 
    dbo.put("_id", car.getId()); 
    // below line produces error 
    dbo.put("wheels", car.getWheels()); 
    return dbo; 
} 
} 

и мой Car.java в

@Document(collection = "car") 
public class Car implements Serializable { 
private static final long serialVersionUID = 6121244806685144430L; 

@Id private String id; 
private List<Wheel> wheels; 

// getters and setters 
} 

и мой Wheel.java, как (It не является документом, только фасоль)

public class Wheel implements Serializable { 
private static final long serialVersionUID = 6121244806685144430L; 

private String wheelId; 
private String name; 

//getters and setters 
} 

Я получил ошибку ниже, когда я пытаюсь сделать сохранить мой Автомобиль объект для mongodb.

SLF4J: Failed toString() invocation on an object of type [com.mongodb.BasicDBObject] 
java.lang.RuntimeException: json can't serialize type : class com.mypackage.Wheel 
at com.mongodb.util.ClassMapBasedObjectSerializer.serialize(ClassMapBasedObjectSerializer.java:77) 
at com.mongodb.util.JSONSerializers$IterableSerializer.serialize(JSONSerializers.java:290) 
at com.mongodb.util.ClassMapBasedObjectSerializer.serialize(ClassMapBasedObjectSerializer.java:79) 
at com.mongodb.util.JSONSerializers$MapSerializer.serialize(JSONSerializers.java:317) 
at com.mongodb.util.ClassMapBasedObjectSerializer.serialize(ClassMapBasedObjectSerializer.java:79) 
at com.mongodb.util.JSON.serialize(JSON.java:55) 
at com.mongodb.util.JSON.serialize(JSON.java:40) 
at com.mongodb.BasicDBObject.toString(BasicDBObject.java:83) 
at org.slf4j.helpers.MessageFormatter.safeObjectAppend(MessageFormatter.java:276) 
at org.slf4j.helpers.MessageFormatter.deeplyAppendParameter(MessageFormatter.java:248) 
at org.slf4j.helpers.MessageFormatter.arrayFormat(MessageFormatter.java:206) 
at org.slf4j.helpers.MessageFormatter.format(MessageFormatter.java:148) 
at org.slf4j.impl.Log4jLoggerAdapter.info(Log4jLoggerAdapter.java:341) 
INFO : org.springframework.data.mongodb.core.mapping.event.LoggingEventListener - onBeforeSave: 
[email protected], [FAILED toString()] 
java.lang.IllegalArgumentException: can't serialize class com.mypackage.Wheel 
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:284) 
at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:309) 
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:248) 
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:185) 
at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:131) 
at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:33) 
at com.mongodb.OutMessage.putObject(OutMessage.java:289) 
at com.mongodb.OutMessage.writeUpdate(OutMessage.java:180) 
at com.mongodb.OutMessage.update(OutMessage.java:60) 
at com.mongodb.DBCollectionImpl.update(DBCollectionImpl.java:275) 
at com.mongodb.DBCollection.update(DBCollection.java:191) 
at com.mongodb.DBCollection.save(DBCollection.java:975) 
at com.mongodb.DBCollection.save(DBCollection.java:934) 

Пожалуйста, помогите мне, в чем проблема? Как я могу это исправить?

+0

Я бежал в эту неразбериху и раньше, но никогда не был в состоянии отслеживать его вниз. Можете ли вы разместить свою конфигурацию? Вы используете конфигурацию Java? Возможно, вы захотите попробовать xml-конфигурацию. Какая версия spring-data-mongodb? – helmy

ответ

1

Я столкнулся с этой же ошибкой. Мой документ выглядел так:

@Document 
public class AnalyticsDailyData implements Serializable { 

    private static final long serialVersionUID = -5409790992784008124L; 

    @Id 
    @NotNull 
    @Valid 
    private AnalyticsMetaData metaData; 
... 

Добавление фактического поля id типа ObjectId заставило ошибку уйти для меня. Затем я устанавливаю поле metaData для индексации и уникальности.

@Document 
public class AnalyticsDailyData implements Serializable { 

    private static final long serialVersionUID = -5409790992784008124L; 

    private ObjectId id; 

    @Indexed(unique = true) 
    @NotNull 
    @Valid 
    private AnalyticsMetaData metaData; 
... 

Я до сих пор в состоянии запросить по метаданным после добавления методы к моему Repo:

public interface AnalyticsDailyDataRepo extends PagingAndSortingRepository<AnalyticsDailyData, ObjectId> { 
    AnalyticsDailyData findOneByMetaData(AnalyticsMetaData meta); 
} 
Смежные вопросы