jOOQ:在获取Enum字段时,如果值无法映射,如何确保它抛出异常



我们将jOOQ 3.15.4与Spring Boot 2.6.2 一起使用

我们有一个枚举作为字符串存储在数据库中。在生成的代码中看起来是这样的:

public final TableField<StatusRecord, String> STATUS = createField(DSL.name("status"), SQLDataType.VARCHAR(255).nullable(false), this, "");

在读取它时,我们获取一个带有@Column注释的对象:

@Column(name = "status")
StatusEnum status

我们看到的行为是,当DB中有一个字符串与枚举的任何值都不对应时,我们映射到的对象中的status字段为null。

有没有一种方法可以确保这种类型的安全,并在字符串无法映射到枚举时抛出MappingException,就像枚举的valueOf方法的标准行为一样?

jOOQ的问题跟踪器、邮件列表等中已经多次讨论了该主题。有一个挂起的功能请求,要求将当前忽略不可转换值的行为更改为抛出异常,请参见例如。https://github.com/jOOQ/jOOQ/issues/3377

在过去,要做到这一点而不破坏兼容性并不容易,因为转换是在静态方法中实现的。但由于jOOQ 3.14,我们有一个ConverterProviderSPI,因此可能会使其可配置,并逐渐转向快速故障策略。

话虽如此,您可以实现自己的ConverterProvider并向其添加此类检查。或者,您可以使用代码生成配置将自定义Converter附加到Field,并让它在映射无效值时抛出。