Pourquoi le Printemps de Données MongoDB impossible d'instancier cette imbriquée type de structure?
Mon la structure du document, c'est comme:
{
_id: "A",
groups:[{
groupId: "someId",
groupName: "someName",
params: {
type1: ["a", "b"],
type2: ["c", d]
}
}],
config: {
person: {}
dataDetails: {
dataTypeDetails: {},
dataList: ["dt1", "dt2"]
}
}
}
Ma source de Données MongoDB types de modèle ressembler à ceci:
//Imports etc.
@Document
public class Entity {
@Id
private String _id;
private List<Group> groups;
private Config config;
//setters and getters
public class Group {
private String groupId;
private String groupName;
private ParamData params;
//setter and getters
}
public class ParamData {
private List<String> type1;
private List<String> type2;
}
public class Config {
private Map person;
private DataConfig dataDetails;
}
public class DataConfig {
private Map dataTypeDetails;
private List<String> dataList;
}
}
Stacktrace:
org.springframework.data.mapping.model.MappingInstantiationException: Failed to instantiate com.****.common.models.Entity$ParamData using constructor public com.****.common.models.Entity$ParamData(com.****.common.models.Entity) with arguments com.****.common.models.Entity$Group@2eb61a7b
at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:78)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:257)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:237)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readValue(MappingMongoConverter.java:1136)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.access$100(MappingMongoConverter.java:78)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1085)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getValueInternal(MappingMongoConverter.java:816)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:270)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:263)
at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:261)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:263)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:237)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readCollectionOrArray(MappingMongoConverter.java:861)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readValue(MappingMongoConverter.java:1134)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.access$100(MappingMongoConverter.java:78)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1085)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getValueInternal(MappingMongoConverter.java:816)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:270)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:263)
at org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:261)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:263)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:237)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:201)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:197)
at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:78)
at org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:2016)
at org.springframework.data.mongodb.core.MongoTemplate.executeFindMultiInternal(MongoTemplate.java:1700)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1523)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1507)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:532)
at org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:497)
at org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:489)
Mon dans DAO, je suis en train de chercher le document en identifiant, mais il est en train d'échouer pour les valeurs à dataDetails et params. Si je commente la ParamData
param, j'obtiens l'erreur pour DataConfig
. Les données ont été ajoutés à l'aide de ligne de commande/node scripts et n'a pas été ajoutés à l'aide de ce code. Mais elle s'extrait correctement par node/mangouste ainsi que de la ligne de commande.
OriginalL'auteur NikhilWanpal | 2014-10-14
Vous devez vous connecter pour publier un commentaire.
Cela semble être un problème avec doublement imbriquée à l'intérieur des classes et de la synthèse généré constructeurs créé par le compilateur. J'ai pu reproduire ce problème en local et voir si nous pouvons fournir un correctif. En attendant, vous avez deux options:
ParamData
classe dans leGroup
classe,DataConfig
enConfig
car qui sera la cause de la synthétique les constructeurs créé de façon qu'ils correspondent à l'instanciation de l'ordre de Printemps de Données repose actuellement sur.Je vous suggère de l'ancienne approche, car il n'est pas artificiellement lier les classes d'instances de l'extérieur de la classe.
ParamData
à l'intérieur deGroup
etDataConfig
dansConfig
classe, il est aujourd'hui. Mais ont buté sur un autre problème, ce n'est pas pour me permettre de déclarer laList<Group>
, il doitArrayList<Group>
ouGroup[]
, mais qui fonctionne bien pourList<String>
! Mais pour l'instant, son travail au moins.OriginalL'auteur Oliver Drotbohm
indique qu'il est impossible de créer des objets à l'aide de la réflexion.
Avez-vous des getters et setters pour tous les champs de toutes vos classes? Votre code ci-dessus n'ont pas pour
ParamData
,Config
etDataConfig
.Aussi, si vous avez des non-constructeurs par défaut dans l'un de vos classes assurez-vous d'avoir un argument vide de constructeur, d'autre réflexion échouera.
Je ne suis pas sûr si pour des raisons de gain de place, ici, vous avez gardé tous vos classes dans
Entity
classe elle-même, ou si ils sont dans leurs propres fichiers de classe. Vous avez besoin d'avoir à chaque classe dans un fichier séparé annoté avec@Document
. Par exemple, voir ici: stackoverflow.com/questions/11255100/...Ce n'est pas obligatoire. Si fait correctement, l'intérieur des classes.
Ah, je vois. Ne peut pas tout à fait comprendre pourquoi c'est un échec alors...
OriginalL'auteur arun