2014-01-31 31 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合併,新版本發佈