jOOQ DSLContext Bean не создается в проекте Micronaut - PullRequest
2 голосов
/ 01 октября 2019

Я пытаюсь использовать jOOQ в своем приложении Micronaut, и мне автоматически предоставляется jOOQ DSLContext как внедренный компонент в мой конструктор, но он не может найти компонент.

Я настроил свойисточники данных в моем application.yml для подключения к моей базе данных postgres, и я объявил мой конструктор следующим образом:

@Singleton
public class RepositoryImpl implements Repository
{
    private final DSLContext context;

    public RepositoryImpl(DSLContext context)
    {
        this.context = context;
    }
}

и мой application.yml как:

datasources:
  default:
    url: "jdbc:postgresql://localhost:5432/my_db"
    username: "user"
    password: "password"
    driver-class-name: "org.postgresql.Driver"

Я включилследующие зависимости в моем build.gradle

    compile 'io.micronaut.configuration:micronaut-jooq'
    runtime 'org.postgresql:postgresql:42.2.4'

Я ожидаю, что смогу получить доступ к DSLContext и писать запросы в своем классе RepositoryImpl, но при попытке использовать класс реализации код завершится неудачей со следующим исключением:

Caused by: io.micronaut.context.exceptions.NoSuchBeanException: No bean of type [org.jooq.DSLContext] exists. Make sure the bean is not disabled by bean requirements (enable trace logging for 'io.micronaut.context.condition' to check) and if the bean is enabled then ensure the class is declared a bean and annotation processing is enabled (for Java and Kotlin the 'micronaut-inject-java' dependency should be configured as an annotation processor).

Кто-нибудь смог успешно использовать этот bean-компонент, как описано здесь в руководстве micronaut-sql? https://micronaut -projects.github.io / micronaut-SQL / снимок / руководство / index.html # jooq

1 Ответ

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

DSLContext существует на org.jooq.Configuration, поэтому прежде всего вам нужно каким-то образом создать последний экземпляр.

Вы можете определить класс, аннотированный @Factory, и добавить javax.sql.DataSource в его конструктор. который содержит конфигурацию источника данных Micronaut. После этого вы должны определить метод (помеченный @Singleton) в этом классе, и этот метод должен вернуть org.jooq.Configuration. Внутри этого метода вы можете настроить jOOQ, в основном вы можете использовать DefaultConfiguration(), но вы должны установить свой диалект SQL, вызвав для него setSQLDialect(SQLDialect.POSTGRES), и вы также должны установить свой источник данных (set(datasource)) с введенным источником данныхв класс.

import io.micronaut.context.annotation.Factory;
import org.jooq.Configuration;
import org.jooq.SQLDialect;
import org.jooq.impl.DefaultConfiguration;

import javax.inject.Singleton;
import javax.sql.DataSource;

@Factory
public class JooqConfigurationFactory {
    private final DataSource dataSource;

    public JooqConfigurationFactory(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Singleton
    public Configuration configuration() {
        DefaultConfiguration configuration = new DefaultConfiguration();
        configuration.setSQLDialect(SQLDialect.POSTGRES);
        configuration.set(dataSource);

        return configuration;
    }
}

И ваш репозиторий будет выглядеть так:

import org.jooq.Configuration;
import org.jooq.DSLContext;

public class ExampleRepository {
    private final DSLContext context;

    public ExampleRepository(Configuration config) {
        this.context = config.dsl();
    }
}
...