2013-07-17 2 views
4

Мне нужен общий экземпляр com.fasterxml.jackson.databind.ObjectMapper в grails, поэтому я думаю, что самый стандартный способ сделать это - через beans DSL. я пытался что-то подобное (с большим количеством вариантов, как с помощью делегата ключевого слова) в resources.groovyКонфигурирование объекта ObjectMapper от пользователя Grail DSL

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

, но это не сработало, ObjectMapper настроен путь по умолчанию, что не очень хорошо работает с Грааль. я использовал обходной путь, который делает то, что мне нужно (в 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:

  • создать подкласс и сделать работу в конструкторе
  • создать экземпляр ObjectMapper в factory (method)
  • написать factory bean
  • ...

Вы можете использовать все e Весенние контейнерные механизмы IoC для создания экземпляров bean в Grails.

Не то, чтобы у меня был этот точный прецедент, но я хотел бы создать пользовательский фасоль и поставить логику для конфигурации 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 вызов сложнее, вам придется использовать подход фабричной фабрики, чтобы вызвать метод, определяя отдельный компонент. Дело в том, что вы не хотите, чтобы вызвать методы себя, а вы пытаетесь сказать, что весна это нужно вызвать, когда он хочет создать бобы:

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

согласился, но для моего использования писать, что в конструкторе достаточно хорошо :-) –

Смежные вопросы