我们将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,我们有一个ConverterProvider
SPI,因此可能会使其可配置,并逐渐转向快速故障策略。
话虽如此,您可以实现自己的ConverterProvider
并向其添加此类检查。或者,您可以使用代码生成配置将自定义Converter
附加到Field
,并让它在映射无效值时抛出。