私のドキュメント構造は次のようなものです。
{
_id: "A",
groups:[{
groupId: "someId",
groupName: "someName",
params: {
type1: ["a", "b"],
type2: ["c", d]
}
}],
config: {
person: {}
dataDetails: {
dataTypeDetails: {},
dataList: ["dt1", "dt2"]
}
}
}
私のSpringDataMongoDBモデルタイプは次のようになります。
// 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;
}
}
スタックトレース:
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)
DAOで、識別子によってドキュメントをフェッチしようとしていますが、dataDetailsとparamsの値に対してのみ失敗します。 ParamData
パラメータをコメントアウトすると、DataConfig
のエラーが発生します。データはコマンドライン/ノードスクリプトを使用して追加されたものであり、このコードを使用して追加されたものではありません。ただし、ノード/マングースおよびコマンドラインから適切に取得されています。
これは、二重にネストされた内部クラスと、コンパイラーによって作成された合成的に生成されたコンストラクターの問題のようです。その問題をローカルで再現し、修正を提供できるかどうかを確認できました。それまでの間、2つのオプションがあります。
ParamData
クラスをGroup
クラスに移動し、DataConfig
をConfig
に移動します。これにより、現在のインスタンス化順序SpringDataと一致する方法で合成コンストラクターが作成されます。依存している。クラスを外部クラスのインスタンスに人為的にバインドしないため、前者のアプローチをお勧めします。
Failed to instantiate ... using constructor public ... ReflectionEntityInstantiator
リフレクションを使用してオブジェクトを作成することはできないと言います。
すべてのクラスのすべてのフィールドにゲッターとセッターがありますか?上記のコードには、ParamData
、Config
、およびDataConfig
のコードがありません。
また、いずれかのクラスにデフォルト以外のコンストラクターがある場合は、空の引数コンストラクターがあることを確認してください。そうでない場合、リフレクションは失敗します。