1

I have a write converter as

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

and my Car.java as

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

and my Wheel.java as (It is not document , just a bean)

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

private String wheelId;
private String name;

//getters and setters
}

I got the below error when I try to save my Car object to 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:
com.mypackage.Car@1e4ec58, [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)

Please somebody help me , what is the problem ? How can I fix it ?

1
  • I've run into this mess before, but have never been able to track it down. Can you post your configuration? Are you using Java configuration? You might want to try xml configuration. What version of spring-data-mongodb? Commented Nov 13, 2014 at 13:45

1 Answer 1

1

I ran into this same error. My Document looked like this:

@Document
public class AnalyticsDailyData implements Serializable {

  private static final long serialVersionUID = -5409790992784008124L;

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

Adding an actual id field of type ObjectId made the error go away for me. I then set the metaData field to be indexed and unique.

@Document
public class AnalyticsDailyData implements Serializable {

  private static final long serialVersionUID = -5409790992784008124L;

  private ObjectId id;

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

I am still able to query by metaData after adding a method to my Repo:

public interface AnalyticsDailyDataRepo extends PagingAndSortingRepository<AnalyticsDailyData,   ObjectId> {
  AnalyticsDailyData findOneByMetaData(AnalyticsMetaData meta);
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.