Warum ist Spring Data MongoDB nicht in der Lage zu instanziieren, diese verschachtelte Struktur?
Mein Dokument-Struktur ist wie:
{
_id: "A",
groups:[{
groupId: "someId",
groupName: "someName",
params: {
type1: ["a", "b"],
type2: ["c", d]
}
}],
config: {
person: {}
dataDetails: {
dataTypeDetails: {},
dataList: ["dt1", "dt2"]
}
}
}
Mein Spring Data MongoDB Modell-Typen wie folgt Aussehen:
//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)
Meine in DAO bin ich versucht zu Holen, das Dokument mit dem Bezeichner, aber es nicht nur für die Werte an dataDetails und params. Wenn ich kommentiere die ParamData
param, bekomme ich Fehler für DataConfig
. Die Daten, die Hinzugefügt wurde, mit dem Befehl line/Knoten, Skripte und wurde nicht Hinzugefügt, mit diesem code. Aber es ist immer ordnungsgemäß abgerufen wurde, indem Sie Knoten/mongoose als auch von der Kommandozeile aus.
InformationsquelleAutor NikhilWanpal | 2014-10-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies scheint ein Problem zu sein mit doppelt geschachtelte innere Klassen und der synthetisch erzeugten Konstruktoren, die vom compiler erstellten. Konnte ich reproduzieren, das Problem lokal und sehen, ob können wir ein Update. In der Zwischenzeit haben Sie zwei Möglichkeiten:
ParamData
Klasse in dieGroup
KlasseDataConfig
inConfig
als dazu führen, dass der synthetische Konstruktoren erstellt in einer Weise, die Sie passen Instanziierung, um Spring Data derzeit setzt auf.Ich würde vorschlagen, der erste Ansatz, da es nicht künstlich binden die Klassen, um Instanzen der äußeren Klasse.
ParamData
innenGroup
undDataConfig
imConfig
Klasse, es funktioniert jetzt. Aber haben stolperte über ein anderes problem, dessen Sie nicht lassen Sie mich erklären, dieList<Group>
braucht esArrayList<Group>
oderGroup[]
, aber funktioniert gut fürList<String>
! Aber für jetzt, seine arbeiten wenigstens.InformationsquelleAutor Oliver Drotbohm
sagt, es kann nicht erstellen Sie die Objekte mit der spiegelung.
Haben Sie Getter und setter für alle Felder in allen Klassen? Dein code oben funktioniert nicht, habe Sie für
ParamData
,Config
undDataConfig
.Auch, wenn Sie geschehen, haben nicht-default Konstruktoren in Ihren Klassen stellen Sie sicher, Sie haben ein leeres argument-Konstruktor, sonst reflektion wird scheitern.
Ich bin nicht sicher, wenn im Interesse der Rettung Platz hier behalten Sie alle Ihre Klassen in
Entity
Klasse selbst, oder wenn Sie in Ihrer eigenen class-Dateien. Sie müssen jede Klasse in einer separaten Datei kommentiert mit@Document
. Zum Beispiel finden Sie hier: stackoverflow.com/questions/11255100/...Das ist nicht erforderlich. Wenn es richtig gemacht, inneren Klassen arbeiten.
Ah, ich sehe. Kann nicht ganz herausfinden, warum es fehlschlägt, dann...
InformationsquelleAutor arun