2014-01-31 32 views
2

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

目前,它是利用全包名称序列化:

"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); 
    } 
} 

回答

1

我有同样的问题,我觉得是由造成的0的代理。

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

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

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

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

2

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

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

  1. 标准弹簧SessionFactory的定义某处在我的XML配置:

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
        ... 
    </bean> 
    
  2. 我也定义为一个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

+0

谢谢!这个解决方案在我的应用程序中工作正常 – EPerrin95

+0

这看起来应该可以工作,但我无法弄清楚如何在spring引导应用程序中获取localSessionFactoryBean的句柄? – chrismarx

+0

啊,没关系,按照这里的建议,我可以获得SessionFactory,然后我可以将它转换为映射 - http://stackoverflow.com/a/33881946/228369 – chrismarx

0

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

你可以用它(编译成JAR文件,或直接在代码中使用),或者等待my pull request合并,新版本发布