如何通过Maven配置定义显式Binding?jOOQ生成类遇字段废弃警告
解决jOOQ生成器的未知类型废弃警告与Maven配置显式Binding
看起来你碰到了jOOQ处理数据库point类型时的常见问题——因为jOOQ无法自动识别这个特殊类型,所以生成了Object类型的字段并标记为废弃。下面我来一步步教你怎么通过Maven配置显式Binding来彻底解决这个问题,顺便也说下临时关闭警告的方法。
第一步:创建自定义Binding类
首先你需要写一个实现org.jooq.Binding的类,用来处理数据库point类型和Java类型之间的转换。这里我以映射到java.awt.Point为例,你也可以换成自己的坐标类:
import org.jooq.*; import org.jooq.impl.DSL; import java.sql.*; import java.util.Objects; public class PointBinding implements Binding<Object, java.awt.Point> { @Override public Converter<Object, java.awt.Point> converter() { return new Converter<>() { @Override public java.awt.Point from(Object databaseObject) { if (databaseObject == null) return null; // 解析数据库返回的point字符串,比如PostgreSQL的"(x,y)"格式 String pointStr = databaseObject.toString().replaceAll("[()]", ""); String[] coords = pointStr.split(","); return new java.awt.Point(Integer.parseInt(coords[0]), Integer.parseInt(coords[1])); } @Override public Object to(java.awt.Point userObject) { if (userObject == null) return null; return String.format("(%d,%d)", userObject.x, userObject.y); } @Override public Class<Object> fromType() { return Object.class; } @Override public Class<java.awt.Point> toType() { return java.awt.Point.class; } }; } @Override public void sql(BindingSQLContext<java.awt.Point> ctx) throws SQLException { // 生成SQL时添加类型转换,适配PostgreSQL的point类型 ctx.render().visit(DSL.val(ctx.convert(converter()).value())).sql("::point"); } @Override public void register(BindingRegisterContext<java.awt.Point> ctx) throws SQLException { ctx.statement().registerOutParameter(ctx.index(), Types.VARCHAR); } @Override public void set(BindingSetStatementContext<java.awt.Point> ctx) throws SQLException { ctx.statement().setString(ctx.index(), Objects.toString(ctx.convert(converter()).value(), null)); } @Override public void get(BindingGetResultSetContext<java.awt.Point> ctx) throws SQLException { ctx.convert(converter()).value(ctx.resultSet().getString(ctx.index())); } @Override public void get(BindingGetStatementContext<java.awt.Point> ctx) throws SQLException { ctx.convert(converter()).value(ctx.statement().getString(ctx.index())); } @Override public void set(BindingSetSQLOutputContext<java.awt.Point> ctx) throws SQLException { throw new SQLFeatureNotSupportedException("暂不支持SQL输出绑定"); } @Override public void get(BindingGetSQLInputContext<java.awt.Point> ctx) throws SQLException { throw new SQLFeatureNotSupportedException("暂不支持SQL输入绑定"); } }
第二步:在Maven中配置jOOQ生成器
接下来修改你的pom.xml,在jOOQ代码生成插件里添加<forcedTypes>配置,把刚才写的Binding绑定到COORDINATES字段:
<build> <plugins> <plugin> <groupId>org.jooq</groupId> <artifactId>jooq-codegen-maven</artifactId> <version>你的jOOQ版本号</version> <!-- 比如3.18.0 --> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <!-- 这里是你的数据库连接配置,比如URL、用户名、密码 --> <jdbc> <driver>org.postgresql.Driver</driver> <!-- 根据你的数据库调整 --> <url>jdbc:postgresql://localhost:5432/your_db</url> <user>your_user</user> <password>your_password</password> </jdbc> <generator> <database> <name>org.jooq.meta.postgres.PostgresDatabase</name> <!-- 数据库元数据类,根据数据库调整 --> <inputSchema>public</inputSchema> <!-- 你的数据库schema --> <!-- 核心:配置强制类型绑定 --> <forcedTypes> <forcedType> <userType>java.awt.Point</userType> <!-- 映射后的Java类型 --> <binding>com.yourpackage.PointBinding</binding> <!-- 自定义Binding的全类名 --> <includeExpression>^COORDINATES$</includeExpression> <!-- 精确匹配字段名 --> <includeTypes>point</includeTypes> <!-- 匹配数据库中的point类型 --> </forcedType> </forcedTypes> <!-- 如果只是临时关闭废弃警告,可以打开下面这行,但不推荐长期用 --> <!-- <deprecationOnUnknownTypes>false</deprecationOnUnknownTypes> --> </database> <target> <packageName>com.yourpackage.generated</packageName> <!-- 生成类的包路径 --> <directory>src/main/java</directory> <!-- 生成类的输出目录 --> </target> </generator> </configuration> </plugin> </plugins> </build>
配置说明
<userType>:指定你希望jOOQ生成的Java字段类型,这里用的是java.awt.Point,你也可以替换成自己定义的坐标DTO类<binding>:必须是自定义Binding类的全限定类名,确保jOOQ能找到这个类<includeExpression>:用正则表达式匹配字段名,^COORDINATES$表示精确匹配名为COORDINATES的字段<includeTypes>:匹配数据库中的类型,比如PostgreSQL的point,如果是其他数据库的空间类型,需要调整这个值
临时解决:关闭废弃警告
如果你只是想先关掉警告而暂时不实现Binding,只需要在<database>节点下添加:
<deprecationOnUnknownTypes>false</deprecationOnUnknownTypes>
但这只是权宜之计,长期来看还是配置显式Binding能让类型更安全,避免后续出现类型转换问题。
运行mvn jooq-codegen:generate重新生成代码后,COORDINATES字段就会变成你指定的Java类型,废弃警告也会消失啦!
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

