JDBI с использованием внутренних классов - PullRequest
0 голосов
/ 17 октября 2019

У меня есть POJO, который содержит внутренний (нестатический) класс, поскольку он разделяет родительский идентификатор

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?

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Нестатический внутренний класс может быть создан только в отношении экземпляра внешнего класса. Например, рассмотрим класс:

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)

Похоже, что код пытается создать экземпляр Outer $ Inner с newInstance () , который не может работать, потому что нет ссылки на экземпляр Outer .

Я не уверен, что ожидал бы отображение отражателяобрабатывать внутренние классы из коробки, поэтому я бы не сказал, что это был недостаток в JDBI, но вам, возможно, придется немного поспорить с пользовательским преобразователем или расширить отражающий преобразователь, чтобы заставить это работать на вас.

0 голосов
/ 17 октября 2019

Он пытается создать экземпляр вашего класса Child, но у этого класса нет конструктора по умолчанию (конструктор без каких-либо параметров).

...