【发布时间】:2021-01-22 22:43:21
【问题描述】:
我对 JOOQ 框架 (3.13.4) 以及 Spring Boot 和 Java 8 有疑问。
问题是我正在尝试使用 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 的类型,因为在这种情况下,我需要有可能在运行时更改数据源。这个东西在项目的其他区域运行良好(或者换句话说,使用 Hibernate 或 MyBatis 等工具)。
如您所见,有一个 @PostConstruct 方法用于生成域类,问题是该方法不会生成任何错误或其他东西,但也不会生成类。我尝试使用 PostgreSQL 和 Oracle 数据库运行它(当然要更改驱动程序、数据库名称等),情况看起来完全一样。
一个有趣的事情是,当我运行此代码并且包 com.ormtester.jooq.domain 存在时 - 在方法执行期间 domain 包被删除.
我还想提一下,通过位于项目主(启动器)类中的 @SpringBootApplication 注释排除 JooqAutoConfiguration 类来禁用 JOOQ 自动配置。 p>
IDE 正在管理员模式下运行 - 还有什么有趣的地方 - 如果我将在我提供的自定义命名策略中的 getJavaClassName() 方法中设置断点(CustomStrategyProvider 扩展了 DefaultGeneratorStrategy 类,每次使用该方法都会到达断点。
那么有没有人遇到过同样的问题和/或只是可以告诉我我做错了什么或者我在这里提供的代码 sn-p 中缺少什么?我从大约 4 天开始就遇到了这个问题,现在我已经没有什么想法可能出问题了。我浏览了许多论坛上的大量主题,但没有任何帮助,包括作者页面上的教程(在我看来,它根本缺乏重要信息)。
我将非常感谢您的每一次帮助 - 提前致谢!
【问题讨论】:
标签: java mysql spring spring-boot jooq