web-dev-qa-db-ja.com

Spring Data MongoDBがこのネストされた型の構造をインスタンス化できないのはなぜですか?

私のドキュメント構造は次のようなものです。

{
    _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のエラーが発生します。データはコマンドライン/ノードスクリプトを使用して追加されたものであり、このコードを使用して追加されたものではありません。ただし、ノード/マングースおよびコマンドラインから適切に取得されています。

12
NikhilWanpal

これは、二重にネストされた内部クラスと、コンパイラーによって作成された合成的に生成されたコンストラクターの問題のようです。その問題をローカルで再現し、修正を提供できるかどうかを確認できました。それまでの間、2つのオプションがあります。

  1. 内部クラスを静的クラスに変換します。これにより、合成コンストラクターが削除され、インスタンス化が正しく機能します。
  2. プロパティをネストするのと同じ方法で、型宣言をネストします。つまりParamDataクラスをGroupクラスに移動し、DataConfigConfigに移動します。これにより、現在のインスタンス化順序SpringDataと一致する方法で合成コンストラクターが作成されます。依存している。

クラスを外部クラスのインスタンスに人為的にバインドしないため、前者のアプローチをお勧めします。

5
Oliver Drotbohm
Failed to instantiate ... using constructor public ... ReflectionEntityInstantiator

リフレクションを使用してオブジェクトを作成することはできないと言います。

すべてのクラスのすべてのフィールドにゲッターとセッターがありますか?上記のコードには、ParamDataConfig、およびDataConfigのコードがありません。

また、いずれかのクラスにデフォルト以外のコンストラクターがある場合は、空の引数コンストラクターがあることを確認してください。そうでない場合、リフレクションは失敗します。

1
arun