gpt4 book ai didi

java - 覆盖由 jackson-datatype-hibernate 生成的 id 名称

转载 作者:行者123 更新时间:2023-11-30 08:26:28 27 4
gpt4 key购买 nike

是否可以覆盖 jackson-datatype-hibernate Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS 生成的名称?

目前它正在使用完整的包名进行序列化:

"client":{"com.test.domain.Client":1}

我希望它改用 id:

"client":{"id":1}

我正在对 ObjectMapper 进行子类化,所以也许有一些我可以 Hook 的方法

public class HibernateAwareObjectMapper extends ObjectMapper {

public HibernateAwareObjectMapper() {
Hibernate4Module hbm = new Hibernate4Module();
hbm.configure(Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS, true);
registerModule(hbm);
}
}

最佳答案

我遇到了同样的问题。我深入研究了 Jackson 代码,发现如果您使用 Hibernate 映射创建 Hibernate4Module,它应该可以工作。

所以我的解决方案如下所示。

  1. 我的 XML 配置中某处的标准 Spring SessionFactory 定义:

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    ...
    </bean>
  2. 我将自定义 Jackson 对象映射器也定义为 Spring bean:

    <bean class="my.own.HibernateAwareObjectMapper"/>
  3. 现在是关键部分。您需要将 LocalSessionFactoryBean 注入(inject)到 ObjectMapper 中:

    @Autowired
    public HibernateAwareObjectMapper(LocalSessionFactoryBean sessionFactoryBean) {
    Hibernate4Module hibernate4Module = new Hibernate4Module(sessionFactoryBean.getConfiguration().buildMapping());
    hibernate4Module.configure(Hibernate4Module.Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS, true);
    registerModule(hibernate4Module);
    }

我认为,由于此代码仅运行一次,因此不会对性能产生任何重大影响。如果您没有将 ObjectMapper 定义为 Spring bean,您应该能够通过 ApplicationContextAware 实现相同的目的。和 getBean() 方法用这个技巧 https://stackoverflow.com/a/2736147/380891 .

关于java - 覆盖由 jackson-datatype-hibernate 生成的 id 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21472926/

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