Проблема с Lombok и Spring Boot - невозможно найти соответствующий конструктор в классе - PullRequest
0 голосов
/ 13 июля 2020

У меня есть следующий базовый класс:

@Getter
@Setter
@SuperBuilder
abstract class Process {
    private String section;
    private String description;
}

Следующий класс расширяет класс Process:

@Getter
@Setter
@SuperBuilder
public class OverdueProcessDTO extends Process {

    private int count;

/*    public OverdueProcessDTO(String section, String description, int count) {
        super(section, description);
        this.count = count;
    }*/
}

Когда я загружаю свое приложение для загрузки Spring, вызывается следующее выполнение:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [dummy.domain.dto.OverdueProcessDTO]. Expected arguments are: java.lang.String, java.lang.String, int [SELECT new dummy.domain.dto.OverdueProcessDTO (p.section, p.description, p.count) FROM dummy.domain.Test1 p 
WHERE p.labelDesc like ('%more than 1 hours') ORDER BY p.section ASC]

Когда я комментирую @SuperBuilder в классе Process и OverdueProcessDTO, а также раскомментирую конструктор OverdueProcessDTO, он работает нормально. Есть идеи, почему я получаю указанную выше ошибку?

1 Ответ

0 голосов
/ 13 июля 2020

Концептуально lombok работает во время компиляции, поэтому во время компиляции он генерирует некоторый код.

Использование приведенных выше аннотаций приводит к ситуации, когда конструктор с подписью: public OverdueProcessDTO(String, String, int) не создается.

Затем, во время выполнения Hibernate, кажется, ищет такой конструктор и не находит его, следовательно, исключение.

Когда вы раскомментируете рукописный конструктор, lombok не сгенерирует ничего, что мешает вашему "ручное" определение, следовательно, оно работает.

Теперь о разрешении: я предлагаю использовать инструмент под названием «деломбок» - он может показать вам, что именно было создано ломбоком. Чтобы вы могли самостоятельно проверить, существует ли конструктор, требуемый Hibernate, или нет.

В настоящее время код java, сгенерированный lombok для DTO:

public class OverdueProcessDTO extends Process {
    private int count;

    protected OverdueProcessDTO(OverdueProcessDTOBuilder<?, ?> b) {
        super(b);
        this.count = b.count;
    }

    public static OverdueProcessDTOBuilder<?, ?> builder() {
        return new OverdueProcessDTOBuilderImpl();
    }

    public int getCount() {
        return this.count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public static abstract class OverdueProcessDTOBuilder<C extends OverdueProcessDTO, B extends OverdueProcessDTO.OverdueProcessDTOBuilder<C, B>> extends Process.ProcessBuilder<C, B> {
        private int count;

        public B count(int count) {
            this.count = count;
            return self();
        }

        protected abstract B self();

        public abstract C build();

        public String toString() {
            return "OverdueProcessDTO.OverdueProcessDTOBuilder(super=" + super.toString() + ", count=" + this.count + ")";
        }
    }

    private static final class OverdueProcessDTOBuilderImpl extends OverdueProcessDTOBuilder<OverdueProcessDTO, OverdueProcessDTOBuilderImpl> {
        private OverdueProcessDTOBuilderImpl() {
        }

        protected OverdueProcessDTO.OverdueProcessDTOBuilderImpl self() {
            return this;
        }

        public OverdueProcessDTO build() {
            return new OverdueProcessDTO(this);
        }
    }
}
...