gpt4 book ai didi

java - 在 Hibernate 中使用 Spring boot 配置的 Jackson Objectmapper

转载 作者:行者123 更新时间:2023-12-04 07:56:54 24 4
gpt4 key购买 nike

我想配置 Hibernate 以使用 Jackson 的 Objectmapper由 Spring 创建以在 json 和实体之间进行映射。在我正在处理的项目中,我已经将 Jooq 配置为使用 Spring 的 ObjectMapper但是我在如何配置 Hibernate 以使用它时遇到了麻烦。 目标最后是 Jooq 和 Hibernate 将使用相同的 ObjectMapper .
我查了这个 article通过弗拉德。不幸的是,文章中给出的所有技巧都不适用于我正在从事的项目。
这是我尝试过的示例配置

@Configuration
public class HibernateConfiguration implements HibernatePropertiesCustomizer {
//Autowire Objectmapper created by Spring
@Autowired
ObjectMapper objectMapper;

@Override
public void customize(Map<String, Object> hibernateProperties) {
ObjectMapperSupplier objectMapperSupplier = () -> objectMapper;
// Below config doesn't work since Hibernate types creates it's own mapper
hibernateProperties.put("hibernate.types.jackson.object.mapper", objectMapperSupplier);
}
还通过将 Objectmapper 添加到 hibernate-types.properties 来尝试相同的方法。
#Used by Hibernate but cannot get reference of Spring managed ObjectMapper since this is class is called outside of Spring's context.
hibernate.types.jackson.object.mapper=path.to.ObjectMapperSupplier
我使用的另一种方法但它失败了 NullpointerException当从 JSON 转换为 JsonTypeDescriptor 中的实体时类(class)。
@Configuration
public class HibernateConfiguration implements HibernatePropertiesCustomizer{

@Autowired
ObjectMapper objectMapper;

@Override
public void customize(Map<String, Object> hibernateProperties) {
// Underlying implementation needs some JavaType or propertyClass, otherwise when converting
// from JSON we get a nullpointer.
var jsonBinaryType = new JsonBinaryType(objectMapper);
hibernateProperties.put("hibernate.type_contributors", (TypeContributorList) () ->
Collections.singletonList((typeContributions, serviceRegistry) ->
typeContributions.contributeType(jsonBinaryType)));
}
下面是实体父类(super class)的类型声明。
// This makes Hibernate types create it's own mapper.
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
@MappedSuperclass
public abstract class Entity{

}
那么,是否有任何可能的解决方案如何将 Spring 管理的 ObjectMapper 连接到 Hibernate?

最佳答案

我终于想通了,但这是一种创造性的解决方案......
TLDR:我有一个存储 Spring 配置的 bean objectMapper在静态领域。 BeanFactoryPostProcessor 确保在 Hibernate(类型)尝试加载/获取 ObjectMapper 之前初始化此 bean。
hibernate.properties

hibernate.types.jackson.object.mapper=com.github.lion7.example.HibernateObjectMapperSupplier
HibernateObjectMapperSupplier.kt
package com.github.lion7.example

import com.fasterxml.jackson.databind.ObjectMapper
import com.vladmihalcea.hibernate.type.util.ObjectMapperSupplier
import org.springframework.beans.factory.config.BeanFactoryPostProcessor
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory
import org.springframework.stereotype.Component

class HibernateObjectMapperSupplier : ObjectMapperSupplier {
override fun get(): ObjectMapper =
ObjectMapperHolder.objectMapper
}

@Component
class ObjectMapperHolder(objectMapper: ObjectMapper) {

companion object {
lateinit var objectMapper: ObjectMapper
}

init {
Companion.objectMapper = objectMapper
}

}

@Component
class ObjectMapperDependencyFixer : BeanFactoryPostProcessor {
override fun postProcessBeanFactory(beanFactory: ConfigurableListableBeanFactory) {
val beanDefinition = beanFactory.getBeanDefinition("entityManagerFactory")
val oldDependsOn = beanDefinition.dependsOn ?: emptyArray()
val newDependsOn = oldDependsOn + "objectMapperHolder"
beanDefinition.setDependsOn(*newDependsOn)
}
}
与要点相同的代码: https://gist.github.com/lion7/c8006b69a309e38183deb69124b888b5

关于java - 在 Hibernate 中使用 Spring boot 配置的 Jackson Objectmapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66656772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com