4

我需要 grails 中的 com.fasterxml.jackson.databind.ObjectMapper 的共享实例,所以我认为最标准的方法是通过 beans DSL。我在 resources.groovy 中尝试过类似的东西(有很多变体,比如使用委托关键字)

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

谁能指出我如何在它所属的bean DSL中做到这一点(恕我直言)?

4

3 回答 3

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
于 2013-07-17T14:03:47.480 回答
1

bean闭包参数的类型是AbstractBeanDefinition的某个子类型,它不引用实际的对象实例本身。

有多种方法可以设置可见性和配置 ObjectMapper 实例:

  • 创建一个子类并在构造函数中完成工作
  • 在工厂中实例化 ObjectMapper (方法)
  • 写一个工厂bean
  • ...

您可以使用所有 Spring IoC 容器机制在 Grails 中进行 bean 实例化。

并不是说我有那个确切的用例,而是我倾向于创建一个自定义工厂 bean 并将 ObjectMapper 配置的逻辑放在那里。

于 2013-07-17T09:45:51.993 回答
1

对于可见性位,您可以设置 aVisibilityChecker而不是使用便捷setVisibility方法

vc(VisibilityChecker.Std, Visibility.ANY)

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

但是configure调用比较困难,你必须使用工厂bean方法来调用方法,定义一个单独的bean。关键是您不想自己调用这些方法,而是试图告诉 Spring在它想要创建 bean 时需要调用什么

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

由于 configure 返回对映射器本身的引用,因此确保以正确顺序解决依赖关系的更好方法可能是说

vc(VisibilityChecker.Std, Visibility.ANY)

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

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

然后objectMapper用作您注入其他地方的bean。

于 2013-07-17T14:35:20.373 回答