2013-07-17 67 views
4

我需要在grails中使用com.fasterxml.jackson.databind.ObjectMapper的共享實例,所以我認爲最標準的方法是通過beans DSL。 我想是這樣(有許多變化,比如使用delegate關鍵字)在resources.groovy通過Grail的bean配置Jackson的ObjectMapper DSL

objectMapper(ObjectMapper) { bean -> 
    bean.setVisibility(PropertyAccessor.ALL, Visibility.ANY) 
    bean.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
} 

,但它沒有工作,ObjectMapper配置的默認方式,不使用Grails很好地工作。 我用一種變通方法,其做什麼,我需要(BootStrap.groovy中):

def init = { servletContext -> 
    def bean = Holders.applicationContext.objectMapper 
    bean.setVisibility(PropertyAccessor.ALL, Visibility.ANY) 
    bean.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
} 

任何人都可以點我怎麼做,在豆類DSL,它屬於(恕我直言)?

回答

1

bean的類型閉包參數屬於AbstractBeanDefinition的某個子類型,它並沒有引用實際的對象實例本身。

有多種方式來設置的知名度和配置ObjectMapper實例:

您可以使用all th e Grails中用於bean實例化的Spring IoC容器機制。

不是說我有這個確切的用例,但我傾向於創建一個自定義的工廠bean,並將ObjectMapper配置的邏輯放在那裏。

+0

謝謝,子類似乎對我很好,很簡單(它的工作原理)。 如果沒有人使用純粹的DSL解決方案,我會接受這個 –

1

在構造函數中提供JsonFactory而不是使用默認構造函數。

//resources.groovy 
beans = { 
    jf(com.fasterxml.jackson.core.JsonFactory) 

    objectMapper(ObjectMapper, jf){ 
     visibility(PropertyAccessor.ALL, Visibility.ANY) 
     configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
    } 
} 

這可以在控制檯進行驗證:

assert grailsApplication.mainContext.objectMapper instanceof com.fasterxml.jackson.databind.ObjectMapper 
+0

謝謝,但它似乎不適用於grails 2.3(沒有嘗試早期版本)。它抱怨未找到'bean'屬性;刪除它導致默認ObjectMappper –

+0

@RiccardoCossu你能告訴我你指的是哪個ObjectMapper嗎? ObjectMapper的完整包名稱? – dmahapatro

+0

剛剛編輯的問題,我的錯:它的com.fasterxml.jackson.databind.ObjectMapper –

1

對於知名度位,你可以設置一個VisibilityChecker而不是使用便利setVisibility方法

vc(VisibilityChecker.Std, Visibility.ANY) 

objectMapper(ObjectMapper) { 
    visibilityChecker = ref('vc') 
} 

configure通話是更困難的,你必須使用工廠bean方法來調用方法,定義一個單獨的bean。問題的關鍵是,你不希望自己調用的方法,而你試圖告訴Spring什麼需要調用當它要創建豆:由於配置返回引用

objectMapperConfig(objectMapper:'configure', 
        DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 

到映射器本身,一個更好的辦法來保證依賴於正確的順序得到解決,他們會說

vc(VisibilityChecker.Std, Visibility.ANY) 

objectMapperUnconfigured(ObjectMapper) { 
    visibilityChecker = ref('vc') 
} 

objectMapper(objectMapperUnconfigured:'configure', 
        DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 

,然後使用objectMapper爲你注入其他地方的豆。

+0

感謝和+1的回覆,但我認爲這個子類化是最簡單和最乾淨的方法 –

+1

@RiccardoCossu是的,我認爲子類化和添加'@PostConstruct public void init()'將是最乾淨的方法。 –

+0

同意,但爲了我的使用寫在構造函數中是足夠好的:-) –

相關問題