Java JOOQ没有生成类

Java JOOQ没有生成类,java,mysql,spring,spring-boot,jooq,Java,Mysql,Spring,Spring Boot,Jooq,我对JOOQ框架(3.13.4)以及Spring Boot和Java8有一个问题 问题是,我正在尝试使用java代码方式生成域类(而不是使用带有maven的codegen插件,后者在自定义命名策略提供程序方面遇到了一些问题)。首先让我向您展示@Configuration类,它包含(至少我相信它包含)所有必要的bean: import com.ormtester.common.base.Measurer; import com.ormtester.common.utils.enums.OrmTy

我对JOOQ框架(3.13.4)以及Spring Boot和Java8有一个问题

问题是,我正在尝试使用java代码方式生成域类(而不是使用带有maven的codegen插件,后者在自定义命名策略提供程序方面遇到了一些问题)。首先让我向您展示@Configuration类,它包含(至少我相信它包含)所有必要的bean:


import com.ormtester.common.base.Measurer;
import com.ormtester.common.utils.enums.OrmType;
import com.ormtester.datasources.config.RouteableDataSource;
import org.jooq.SQLDialect;
import org.jooq.codegen.GenerationTool;
import org.jooq.impl.DataSourceConnectionProvider;
import org.jooq.impl.DefaultConfiguration;
import org.jooq.impl.DefaultDSLContext;
import org.jooq.impl.DefaultExecuteListenerProvider;
import org.jooq.util.xml.jaxb.Schema;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.jooq.meta.jaxb.*;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.annotation.PostConstruct;
import java.util.Properties;

@Configuration
@EnableTransactionManagement
public class JooqConfigurator {

    private Properties moduleProperties;

    private RouteableDataSource routeableDataSource;

    public JooqConfigurator(RouteableDataSource routeableDataSource) {
        this.routeableDataSource = routeableDataSource;
        try {
            moduleProperties = new Properties();
            moduleProperties.load(JooqConfigurator.class.getClassLoader()
                    .getResourceAsStream("jooq.properties"));
        } catch (Exception ignore) {}
    }

    @Bean
    public DataSourceConnectionProvider connectionProvider() {
        return new DataSourceConnectionProvider(routeableDataSource);
    }

    @Bean
    public ExceptionTranslator exceptionTransformer() {
        return new ExceptionTranslator();
    }

    @Bean
    public DefaultConfiguration configuration() {
        DefaultConfiguration jooqConfiguration = new DefaultConfiguration();
        jooqConfiguration.set(connectionProvider());
        jooqConfiguration.set(new DefaultExecuteListenerProvider(exceptionTransformer()));
        jooqConfiguration.set(SQLDialect.DEFAULT);
        return jooqConfiguration;
    }

    @Bean
    public DefaultDSLContext dsl() {
        return new DefaultDSLContext(configuration());
    }

    @PostConstruct
    public void generateCode() {
        try {
            GenerationTool.generate(new org.jooq.meta.jaxb.Configuration()
                    .withJdbc(new Jdbc()
                            .withDriver("com.mysql.cj.jdbc.Driver")
                            .withUrl("jdbc:mysql://localhost:3306/ormtester?useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC")
                            .withUser("root")
                            .withPassword("root123"))
                    .withGenerator(new Generator()
                            .withName("org.jooq.codegen.JavaGenerator")
                            .withStrategy(new CustomStrategyProvider())
                            .withDatabase(new Database()
                                    .withName("org.jooq.meta.mysql.MySQLDatabase")
                                    .withIncludes(".*")
                                    .withExcludes("")
                                    .withSchemata(new SchemaMappingType().withInputSchema("ormtester").withOutputSchema("ormtester"))
                                    .withInputCatalog("ormtester")
                                    .withOutputCatalog("ormtester"))
                            .withTarget(new Target()
                                    .withPackageName("com.ormtester.jooq.domain")
                                    .withDirectory("jooq/src/main/java"))));
        } catch (Exception e) {
            System.out.println(e.getLocalizedMessage());
        }
    }
}
RouteableDataSource是一种扩展AbstractRoutingDataSource的类型,因为在这种情况下,我需要在运行时更改datasource。在项目的其他区域(或者换句话说,在Hibernate或MyBatis等工具的帮助下),这项功能运行良好

正如您所看到的,有一个@PostConstruct方法用于生成域类,问题是该方法不会生成任何错误或其他内容,但也不会生成类。我试着用PostgreSQL和Oracle数据库运行它(当然要更改驱动程序、数据库名称等),情况看起来完全一样

一件有趣的事情是,当我运行这段代码时,包com.ormtester.jooq.domain出现了——在方法执行期间,域包被删除了

我还想提到的是,通过项目主(初学者)类中的@SpringBootApplication注释排除JooqAutoConfiguration类,可以禁用JOOQ自动配置

IDE是在管理员模式下运行的,如果我在提供的自定义命名策略(CustomStrategyProvider扩展DefaultGeneratorStrategy类)中的getJavaClassName()方法中设置断点,这也很有趣,每次使用此方法时都会到达断点

那么,是否有人面临同样的问题和/或可以简单地告诉我我在这里提供的代码片段中是否做了错事或遗漏了什么?我从大约4天开始就有这个问题,现在我已经没有什么想法了。我在许多论坛上浏览了大量的主题,但没有任何帮助,包括tu作者页面上的保守党人(在我看来,这只是缺乏重要信息)


我真的非常感谢每一个帮助-提前感谢!

代码生成是一个构建任务,而不是运行时任务。我想不出一个合理的场景,只有在运行时生成代码才有意义

问题是,我正在尝试使用java代码方式生成域类(而不是使用带有maven的codegen插件,后者在自定义命名策略提供程序方面遇到了一些问题)


您必须创建一个单独的maven模块(或项目)构建自定义命名策略,然后将其作为依赖项添加到jOOQ代码生成插件中。这与使用的方式相同。

代码生成是一个构建任务,而不是运行时任务。我想不出一个合理的场景,只有在运行时生成代码才有意义

问题是,我正在尝试使用java代码方式生成域类(而不是使用带有maven的codegen插件,后者在自定义命名策略提供程序方面遇到了一些问题)


您必须创建一个单独的maven模块(或项目)您可以构建自定义命名策略,然后将其作为一个依赖项添加到jOOQ代码生成插件中。其工作方式与相同。

我已将编辑添加到问题中,在您在回答中给出的链接下尝试执行教程中的操作。您能帮我解决我遇到的下一个问题吗?@Marci恩索波列夫斯基:谢谢你的更新。这是一个新问题,与你原来的问题没有太大关系。堆栈溢出的工作方式是你为此创建一个新问题,因为:1)旧问题本身已经对找到它的未来读者有用,2)当你编辑一个问题以不断添加新的、不相关的内容时,未来读者(包括我)会发现很难理解问题的顺序。我会留意你的新问题。我建议恢复对这一问题的编辑。我已经恢复了当前帖子并删除了编辑部分。然后我发布了一个新主题,正如你上面提到的,这是链接:@marcinobolewski非常感谢:)我会马上调查的。我已经在问题中添加了编辑,在你在答案中给出的链接下,我正在尝试做教程中提到的事情。你能帮我解决我面临的下一个问题吗?@Marcinosbolewski:谢谢你的更新。这是一个新问题,与你原来的问题不太相关。堆栈溢出的工作方式是你为此创建一个新问题,因为:1)旧问题本身已经对一些未来的读者有用,2)当你编辑一个问题以不断添加新的、不相关的内容时,未来的读者(包括我)会发现很难理解问题的顺序。我会留意你的新问题。我建议还原这篇文章的编辑。我已经还原了当前文章并删除了编辑部分。然后,我发布了一个新的主题,正如你上面提到的,这里是链接:@Marcinosbolewski,非常感谢:)我会马上调查。