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

jOOQ: when fetching into a Enum field, how to ensure it throws an exception if the value cannot mapped

我们使用 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

我们看到的行为是,当我们在数据库中有一个字符串不对应于枚举的任何值时,我们映射到的对象中的 status 字段为空。

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

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

过去在不破坏兼容性的情况下做到这一点并不容易,因为转换是在静态方法中实现的。但是从 jOOQ 3.14 开始,我们有一个 ConverterProvider SPI,所以有可能使它可配置,并逐渐转向 fail-fast 策略。

话虽如此,您可以实现自己的 ConverterProvider 并向其中添加此类检查。或者,您可以 attach a custom Converter to your Field using code generation configuration,并在映射无效值时让它抛出。