Failed to instantiate * using constructor public * with arguments **
来源:互联网 发布:知乎周刊 编辑:程序博客网 时间:2024/05/22 00:50
Failed to instantiate * using constructor public * with arguments **
今天在从MongoDB
中读取数据到包含有内部类的结构中去的时候一直抛出异常,跟了半天也不知道是什么原因导致的。后来偶然看到 Stackoverflow
上面一哥们也遇到同样的问题,然后才解决了,做一下大自然的搬运工,记录一篇中文博客。
保存在MongoDB
中的数据结构如下:
{ _id: "A", groups:[{ groupId: "someId", groupName: "someName", params: { type1: ["a", "b"], type2: ["c", d] } }], config: { person: {} dataDetails: { dataTypeDetails: {}, dataList: ["dt1", "dt2"] } }}
Java类定义如下:
// Imports etc.@Documentpublic 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)
解决办法如下:
将ParamData
移到Group
类里面,将DataConfig
移到Config
类里面。人家的原版回答如下:
This seems to be an issue with doubly nested inner classes and the synthetically generated constructors created by the compiler. I could reproduce that issue locally and see if we can provide a fix. In the meantime you have two options:
- Turn the inner class into static ones as this will remove the synthetic constructors and instantiation will work correctly.
- Nest the type declarations in the same way you nest the properties. I.e. move the ParamData class into the Group class, DataConfig into Config as that will cause the synthetic constructors created in a way they match instantiation order Spring Data currently relies on.
I’d suggest the former approach as it doesn’t artificially bind the classes to instances of the outer class.
- Failed to instantiate * using constructor public * with arguments **
- This fragment should provide a default constructor (a public constructor with no arguments
- Error: This class should provide a default constructor (a public constructor with no arguments)
- Unable to instantiate fragment make sure class name exists, is public, and has an empty constructor
- Unable to instantiate fragment make sure class name exists, is public, and has an empty constructor
- Spring Boot启动报错:Failed to instantiate [ClassName]: No default constructor found;
- 解决Unity3D 创建UWP应用出现Exception: Failed to build Visual Studio project using arguments
- Using newInstance() to Instantiate a Fragment
- Failed to load or instantiate TagExtraInfo
- Failed to instantiate the default view controller
- Failed to instantiate the default view controller
- Failed to instantiate the default view controller
- Failed to load or instantiate TagLibraryValidator class
- Failed to instantiate one or more classes
- How to fix exception: Failed to instantiate SLF4J LoggerFactory?
- Connection to Auxilary using connect string failed with ORA-12528 [ID 419440.1]
- Authentication to host '' for user '' using method 'mysql_native_password' failed with message
- Using public methods to return private data
- html jstl嵌套jquery代码
- 使用 CXF 做 webservice 简单例子
- LeetCode 263. Ugly Number
- 【多线程】三种方案实现多线程之间相互协作的通信
- 【HDU 1950】Bridging signals(LIS算法求最长上升子序列)
- Failed to instantiate * using constructor public * with arguments **
- 重复元素的删除问题
- Android基本控件复习笔记(一)
- 【CodeForces】371C - Hamburgers(二分)
- c#之用StreamWriter追加写文件
- Ubuntu上搭建samba服务器并远程挂载
- HeadFirst设计模式读书笔记——简单工厂模式
- 开发一个文件搜索程序
- 进阶项目4-体重监测器