You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:24:19