首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用内部类的JDBI

使用内部类的JDBI
EN

Stack Overflow用户
提问于 2019-10-16 22:50:20
回答 2查看 211关注 0票数 0

我有一个POJO,它包含一个内部(非静态)类,因为它共享了父母id。

代码语言:javascript
复制
public Long getId() {
   return Parent.this.getId();
}

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

代码语言:javascript
复制
    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库中的一个缺陷?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-16 23:29:11

非静态内部类只能在引用外部类的实例时构造。因此,例如,考虑这个类:

代码语言:javascript
复制
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构造函数,但它实际上是在隐式引用这个构造函数。您可以看到这一点,因为您不能在第三个(静态)方法中使用相同的代码。

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

这是如何与您的问题有关的堆栈跟踪。

代码语言:javascript
复制
at java.lang.Class.newInstance(Class.java:427)

看起来,代码试图用newInstance()实例化外层$ is,这是因为没有对外层实例的引用而无法工作。

我不确定是否需要一个反射映射程序来处理内部类,因此我不会说这是JDBI的缺陷,但是您可能需要与自定义映射器进行一些争论,或者扩展一个反射映射器来使它为您工作。

票数 1
EN

Stack Overflow用户

发布于 2019-10-16 23:00:16

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58422644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档