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,并在映射无效值时让它抛出。
我们使用 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,并在映射无效值时让它抛出。