使用内部的 JDBI 类

JDBI using Inner Classes

我有一个包含内部(非静态)class 的 POJO,因为它共享父 ID

public Long getId() {
   return Parent.this.getId();
}

现在我试图在 JDBI 中映射这些,但 JDBI 似乎无法实例化内部 class?

    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

我对内在 classes 的经验可悲地缺乏 - 我在这里错过了什么?或者这仅仅是 JDBI 库中的缺陷?

它试图创建您的 class 子实例,但是这个 class 没有默认构造函数(没有任何参数的构造函数)。

非静态内部 class 只能参照外部 class 的实例构造。因此,例如考虑 class:

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();
    }
}

虽然在第一种方法中看起来有一个用于 Inner 的无参数构造函数,但它实际上隐式引用了 this。您可以看到这一点,因为您不能在第三种(静态)方法中使用相同的代码。

确实语法可能看起来有点奇怪,但是第二个和第四个方法演示了如何在显式对象上调用构造函数。

这与您质疑堆栈跟踪有何关系。

at java.lang.Class.newInstance(Class.java:427)

看起来代码正在尝试使用 newInstance() 实例化 Outer$Inner,但无法正常工作,因为有没有引用 Outer.

的实例

我不确定我是否期望反射映射器开箱即用地处理内部 classes,所以我不会说这是 JDBI 的缺陷,但您可能需要做一些与自定义映射器争吵或扩展反射映射器以使它为您工作。