首页 > 解决方案 > JOOQ DSL 查询中的 Ad-Hoc 类型转换

问题描述

场景:我们将一些加密数据作为 blob 存储在 db 中。在读取/保存它时,我们需要使用外部服务对其进行解密/加密。因为它实际上是一个使用外部服务的spring bean,所以我们不能像处理枚举那样使用代码生成器。

我不想使用dslContext.select(field1, field2.convertFrom).from(TABLE_NAME),因为您需要指定表的每个字段。

使用起来很方便dslContext.selectFrom(TABLE_NAME)。想知道我们是否可以通过任何方式在此类查询中注册转换器 bean 以即时执行加密和解密。

谢谢

编辑:我最终使用服务来加密/解密实际使用的值。调用外部服务相对昂贵。有时该值未在请求中使用。使用转换器从 db 读取时总是解密该值可能没有意义。

标签: jooqcustom-type

解决方案


因为它实际上是一个使用外部服务的spring bean,所以我们不能像处理枚举那样使用代码生成器。

为什么不?仅仅因为 Spring 支持依赖注入,而您目前(从 jOOQ 3.15 开始)不能向 jOOQConverterBindinginstances注入任何东西,并不意味着您不能使用其他方式来查找此类服务。根据您可用的内容,您可以使用一些 JNDI 查找或其他方式在需要时从您的Converter.

另一种选择是使用 aConverterProvider并在其中注册您的逻辑。这不会在 jOOQ 记录中生成您的自定义类型,但是每当您将 blob 转换为自定义数据类型时,例如使用反射。

如何在没有依赖注入的情况下访问 Spring Bean?

如果您需要访问您的 Spring Bean,则不需要依赖注入。只需创建以下类,您就可以从静态方法中获取 bean getBean()

@Component
public class ApplicationContextHolder implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    public static <T> T getBean(Class<T> type) {
        return applicationContext.getBean(type);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextHolder.applicationContext = applicationContext;
    }
}

推荐阅读