jooq - JOOQ DSL 查询中的 Ad-Hoc 类型转换
问题描述
场景:我们将一些加密数据作为 blob 存储在 db 中。在读取/保存它时,我们需要使用外部服务对其进行解密/加密。因为它实际上是一个使用外部服务的spring bean,所以我们不能像处理枚举那样使用代码生成器。
我不想使用dslContext.select(field1, field2.convertFrom).from(TABLE_NAME)
,因为您需要指定表的每个字段。
使用起来很方便dslContext.selectFrom(TABLE_NAME)
。想知道我们是否可以通过任何方式在此类查询中注册转换器 bean 以即时执行加密和解密。
谢谢
编辑:我最终使用服务来加密/解密实际使用的值。调用外部服务相对昂贵。有时该值未在请求中使用。使用转换器从 db 读取时总是解密该值可能没有意义。
解决方案
因为它实际上是一个使用外部服务的spring bean,所以我们不能像处理枚举那样使用代码生成器。
为什么不?仅仅因为 Spring 支持依赖注入,而您目前(从 jOOQ 3.15 开始)不能向 jOOQConverter
和Binding
instances注入任何东西,并不意味着您不能使用其他方式来查找此类服务。根据您可用的内容,您可以使用一些 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;
}
}
推荐阅读
- java - 为什么我有这个错误?ArrayIndexOutOfBoundsException
- php - 在特定句子之间插入标签,保持原始大小写
- javascript - 在一个 div 中编写 HTML 标签,在另一个 div 中查看所见即所得
- c++11 - 管理单个内存块的分配器
- c# - Aspose 在 MS Powerpoint 中查找给定单词
- java - 如何在android中每24小时运行一次代码
- c# - 在 iis 上从字节数组加载图像失败
- ios - 邀请某人作为 Apple Developer Program 的管理员,但他无法访问 App Store Connect
- symfony - 实体中的 Symfony 4 自动装配不起作用
- php - contact_us.php 没有向我的网站相关邮件地址发送电子邮件