Embeddable生成错误字段索引致空指针,求解决方案
问题描述
我的表中包含以下docusign_前缀的列:
docusign_account_id TEXT NOT NULL, docusign_envelope_id TEXT NOT NULL,
我通过以下jOOQ配置将这些列打包为Embeddable:
embeddables { embeddable { name = "DOCUSIGN_ENVELOPE_DETAILS" tables = "version" fields { field { name = "ENVELOPE_ID" expression = "DOCUSIGN_ENVELOPE_ID" } field { name = "ACCOUNT_ID" expression = "DOCUSIGN_ACCOUNT_ID" } } } }
但使用时触发空指针异常,原因是生成的Embeddable setter使用了错误的字段索引:单独字段的setter用偏移量15,而Embeddable的setter用偏移量16:
/** * Setter for <code>public.version.docusign_account_id</code>. */ public void setDocusignAccountId(String value) { set(15, value); }
/** * Setter for the embeddable <code>public.DOCUSIGN_ENVELOPE_DETAILS</code>. */ public void setDocusignEnvelopeDetails(DocusignEnvelopeDetailsRecord value) { set(12, value.getEnvelopeId()); set(16, value.getAccountId()); }
手动修正索引后,代码生成时会被复原。除了弃用该功能,有没有额外配置可以解决这个问题?
解决方案
调整Embeddable字段顺序与表列顺序一致
表中列的顺序是docusign_account_id在前,docusign_envelope_id在后,但你配置的Embeddable字段顺序是先ENVELOPE_ID再ACCOUNT_ID。jOOQ生成Embeddable setter时,会按配置的字段顺序对应表中的列索引,顺序不匹配会导致索引错误。修改配置的fields顺序:embeddables { embeddable { name = "DOCUSIGN_ENVELOPE_DETAILS" tables = "version" fields { field { name = "ACCOUNT_ID" expression = "DOCUSIGN_ACCOUNT_ID" } field { name = "ENVELOPE_ID" expression = "DOCUSIGN_ENVELOPE_ID" } } } }升级jOOQ到最新稳定版本
部分旧版本的jOOQ存在Embeddable字段索引计算的bug,升级到最新的稳定版(比如3.18+或更高)可以修复这类索引不匹配的问题。检查是否存在自定义生成策略干扰
如果项目中配置了自定义的代码生成策略(比如自定义GeneratorStrategy),可能会改变字段索引的计算逻辑,需要确认该策略没有干扰Embeddable的索引生成。
内容的提问来源于stack exchange,提问作者User1291
相关产品推荐
相关产品推荐

