NoSuchMethod в JOOQ 3.14 InsertQuery с Postgresql

Я пытаюсь использовать InsertQuery Jooq для вставки записи в базу данных PostgresQL, но сталкиваюсь со следующей ошибкой:

java.lang.NoSuchMethodError: 'org.jooq.UniqueKey org.jooq.impl.Internal.createUniqueKey(org.jooq.Table, org.jooq.Name, org.jooq.TableField[], boolean)'
at fi.eriran.generated.jooq.Keys.<clinit>(Keys.java:36) ~[classes/:na]
at fi.eriran.generated.jooq.tables.User.getPrimaryKey(User.java:124) ~[classes/:na]
at org.jooq.impl.UpdatableRecordImpl.getPrimaryKey(UpdatableRecordImpl.java:119) ~[jooq-3.13.4.jar:na]
at org.jooq.impl.AbstractRecord.set(AbstractRecord.java:349) ~[jooq-3.13.4.jar:na]
at org.jooq.impl.AbstractRecord.set(AbstractRecord.java:325) ~[jooq-3.13.4.jar:na]
at fi.eriran.generated.jooq.tables.records.UserRecord.setUsername(UserRecord.java:44) ~[classes/:na]
at fi.eriran.criminalapi.main.dao.user.query.UserQuery.createInsertRecord(UserQuery.java:37) ~[classes/:na]
at fi.eriran.criminalapi.main.dao.user.query.UserQuery.insert(UserQuery.java:22) ~[classes/:na]

Класс запроса, который я использую, выглядит следующим образом:

@Component
public class UserQuery {

@Autowired
private DslContext ctx;

public InsertQuery<UserRecord> insert(NewUser newUser) {
    InsertQuery<UserRecord> insertQuery = ctx.insertQuery(USER);
    insertQuery.addRecord(createInsertRecord(newUser));
    insertQuery.setReturning();
    return insertQuery;
}

private UserRecord createInsertRecord(NewUser newUser) {
    UserRecord userRecord = new UserRecord();
    userRecord.setUsername(newUser.getUserName());
    userRecord.setPassword(newUser.getPassword());
    return userRecord;
}
}

Таблица базы данных пользователей выглядит следующим образом. Он имеет уникальный ключ в столбце имени пользователя и первичный ключ в столбце идентификатора.

CREATE TABLE criminal."user" (
id serial NOT NULL,
username varchar(500) NOT NULL,
"password" varchar(500) NOT NULL,
created_at timestamptz(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT user_pk PRIMARY KEY (id),
CONSTRAINT user_un UNIQUE (username)
);
CREATE INDEX user_username_idx ON criminal."user" (username);

Если я делаю это с помощью ctx.insertInto... все работает нормально. Сначала я использовал Jooq 3.14.0, но обновление до последней версии 3.14.4 здесь не помогло. Что-то должно быть не так с сгенерированным классом Keys, поскольку все работает до тех пор, пока класс Keys не будет инициализирован. Что-то не так со структурой таблицы Postgresql или что-то пошло не так с генерацией кода?

Полное репо здесь: https://github.com/EriRan/Criminal-API/tree/security-attempt

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
450
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы говорите, что используете jOOQ 3.14, но в трассировке стека есть ссылка на версию 3.13.4:

на org.jooq.impl.UpdatableRecordImpl.getPrimaryKey(UpdatableRecordImpl.java:119) ~[jooq-3.13.4.jar:na]

Вероятно, вы неправильно настроили путь к классам. И версия jOOQ для создания кода, и версия jOOQ для запуска вашего кода должны быть одинаковыми.

Спасибо, что указали на это! Это привело меня на правильный путь, и я понял виновника: у родительского pom был spring-boot-starter-parent с версией 2.3.4.RELEASE, который, в свою очередь, имел JOOQ с версией 3.13.4 в качестве зависимости. Я решил это, обновив до последней версии.

EriRan 15.12.2020 16:45

@Erikr: кажется, это обычная проблема. Возможно, этот пост будет полезен для будущих посетителей этого вопроса: blog.jooq.org/2019/06/26/…

Lukas Eder 15.12.2020 20:33

Другие вопросы по теме