我有一个POJO,它包含一个内部(非静态)类,因为它共享了父母id。
public Long getId() {
return Parent.this.getId();
}现在,我试图将这些映射到JDBI中,但似乎JDBI无法实例化内部类?
Caused by: java.lang.InstantiationException: com.xxxx.Parent$Child
at java.lang.Class.newInstance(Class.java:427)
at org.jdbi.v3.core.mapper.reflect.FieldMapper.construct(FieldMapper.java:214)
... 38 more
Caused by: java.lang.NoSuchMethodException: com.xxxx.Parent$Child.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 39 more遗憾的是,我缺乏内在课程的经验--我在这里缺少什么?或者这仅仅是JDBI库中的一个缺陷?
发布于 2019-10-16 23:29:11
非静态内部类只能在引用外部类的实例时构造。因此,例如,考虑这个类:
public class Outer {
class Inner {}
void implicitReferenceToThis() {
new Inner();
}
void explicitReferenceToThis() {
this.new Inner();
}
static void noReferenceToOuter() {
// new Inner(); // doesnt compile
}
static void explictReferenceToOuter() {
new Outer().new Inner();
}
}虽然在第一种方法中,看起来内部有一个无args构造函数,但它实际上是在隐式引用这个构造函数。您可以看到这一点,因为您不能在第三个(静态)方法中使用相同的代码。
实际上,语法看起来可能有点奇怪,但是第二个和第四个方法演示了如何在显式对象上调用构造函数。
这是如何与您的问题有关的堆栈跟踪。
at java.lang.Class.newInstance(Class.java:427)看起来,代码试图用newInstance()实例化外层$ is,这是因为没有对外层实例的引用而无法工作。
我不确定是否需要一个反射映射程序来处理内部类,因此我不会说这是JDBI的缺陷,但是您可能需要与自定义映射器进行一些争论,或者扩展一个反射映射器来使它为您工作。
发布于 2019-10-16 23:00:16
它尝试创建类子的实例,但是这个类没有默认构造函数(构造函数没有任何参数)。
https://stackoverflow.com/questions/58422644
复制相似问题