【问题标题】:override id name generated by jackson-datatype-hibernate覆盖由 jackson-datatype-hibernate 生成的 id 名称
【发布时间】:2014-02-23 17:25:30
【问题描述】:

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

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

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

我希望它使用 id 代替:

"client":{"id":1}

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

public class HibernateAwareObjectMapper extends ObjectMapper {

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

【问题讨论】:

    标签: java jackson jackson-modules


    【解决方案1】:

    我在my branch in github 中使用@Id 注释解决了它。

    您可以使用它(编译为jar文件或直接在代码中使用)或等待my pull request合并和新版本发布

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。我深入研究了 Jackson 代码,发现如果您使用 Hibernate Mapping 创建 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 注入 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 实现相同的目的。

      【讨论】:

      • 这看起来应该可以工作,但我不知道如何在 Spring Boot 应用程序中获取 localSessionFactoryBean 的句柄?
      • 啊,没关系,按照这里的建议,我可以获得 SessionFactory,然后我可以将其转换为 Mappings - stackoverflow.com/a/33881946/228369
      【解决方案3】:

      我也有同样的问题,我认为是Hibernate的代理引起的。

      我最近还没有完美的解决方案,但是你可以这样解决:

      1. 获取 id,然后创建一个新的 com.test.domain.Client 对象并设置回父对象。然后你会得到"client": {"id":1,...}

      2. 修改您的实体,再添加一个 id 以供父对象读取,例如,clientId。然后你可以避免杰克逊序列化子对象。你会得到{..., "clientId":1,...}

      希望有人能给出更完美的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        • 2016-10-12
        • 2011-05-06
        • 2018-01-04
        相关资源
        最近更新 更多