ClassCastException when retrieving entity with embedded Map property

1,064 views
Skip to first unread message

Thomas

unread,
Jan 13, 2012, 7:20:42 AM1/13/12
to Morphia
I am new to Mongo and also to Google Morphia, i am trying to solve
below
problem without any access.

The datastore service classes for the user chalss are based on
following code:
public class DataStoreObject<T, ID> implements DataAccessObject<T,
ID>,
DataProvider<T> {

private Class<T> entityClass;
private Datastore datastore = null;
private String databaseName = null;
private Query<T> query;

....

public T findOne(final String fieldName, final String value) {
Query<T> query = datastore.createQuery(entityClass).field(fieldName)
.equal(value);
if (query == null)
return null;
return query.get();// CCE thrown
}
...
}

public class UserHome extends DataStoreObject<User, ObjectId> {

public UserHome(final Class<User> entityClass, final String
databaseName) {
super(entityClass, databaseName);
}

...
}

The user class itself :

@Entity(value = "USER", noClassnameStored = true)
public class User implements UserDetails {

@Indexed(value = IndexDirection.ASC, name = "username", unique =
true, dropDups = false)
private String username = null;

@Indexed(value = IndexDirection.ASC, name = "IDX_USER_EMAIL", unique
= false)
private String email = null;

@Embedded
private Map<String, UserAttribute> properties = new HashMap<String,
UserAttribute>();

...
}

The embedded class is a simple POJO.

Running the following test code :

public void deleteUser() {
User user = userHome.findOne("username", "a...@web.cn"); // CCE
thrown
if (user != null)
userHome.delete(user);

user = userHome.findOne("username", "a...@web.cn");
Assert.assertNull(user);
}

throws a class cast exception :
java.lang.RuntimeException: java.lang.RuntimeException:
java.lang.RuntimeException: java.lang.RuntimeException:
java.lang.ClassCastException: java.lang.String cannot be cast to
com.mongodb.DBObject
at com.google.code.morphia.mapping.Mapper.fromDb(Mapper.java:483)
at com.google.code.morphia.mapping.Mapper.fromDBObject(Mapper.java:
267)
at
com.google.code.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:
53)
at
com.google.code.morphia.query.MorphiaIterator.next(MorphiaIterator.java:
48)
at com.google.code.morphia.query.QueryImpl.get(QueryImpl.java:344)
at
org.adams.web.basic.persistence.DataStoreObject.findOne(DataStoreObject.java:
128)
at org.adams.basic.test.MongoDbTest.deleteUser(MongoDbTest.java:42)
at org.adams.basic.test.MongoDbTest.test(MongoDbTest.java:35)
....
Caused by: java.lang.RuntimeException: java.lang.RuntimeException:
java.lang.RuntimeException: java.lang.ClassCastException:
java.lang.String cannot be cast to com.mongodb.DBObject
at
com.google.code.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:
146)
at com.google.code.morphia.mapping.Mapper.readMappedField(Mapper.java:
499)
at com.google.code.morphia.mapping.Mapper.fromDb(Mapper.java:480)
... 35 more
Caused by: java.lang.RuntimeException: java.lang.RuntimeException:
java.lang.ClassCastException: java.lang.String cannot be cast to
com.mongodb.DBObject
at com.google.code.morphia.mapping.Mapper.fromDb(Mapper.java:483)
at
com.google.code.morphia.mapping.EmbeddedMapper.readMapOrCollectionOrEntity(EmbeddedMapper.java:
231)
at
com.google.code.morphia.mapping.EmbeddedMapper.readMap(EmbeddedMapper.java:
207)
at
com.google.code.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:
117)
... 37 more
Caused by: java.lang.RuntimeException: java.lang.ClassCastException:
java.lang.String cannot be cast to com.mongodb.DBObject
at
com.google.code.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:
146)
at com.google.code.morphia.mapping.Mapper.readMappedField(Mapper.java:
503)
at com.google.code.morphia.mapping.Mapper.fromDb(Mapper.java:480)
... 40 more
Caused by: java.lang.ClassCastException: java.lang.String cannot be
cast to com.mongodb.DBObject
at
com.google.code.morphia.mapping.EmbeddedMapper.fromDBObject(EmbeddedMapper.java:
136)
... 42 more


Any idea what goes wrong here ? I'using morphia 0.99, java 1.6, mongo-
java-driver 2.4.
Any help would be highly appreciated.

c. Thomas

Thomas

unread,
Jan 14, 2012, 5:19:36 AM1/14/12
to Morphia
Okay i found the cause, the embedded class as simple pojo
had an value property with Object type. Splitting this into
basic types like integerValue, stringValue and so forth, solved the
problem.
Reply all
Reply to author
Forward
0 new messages